我正在开发一个ASP.net WebAPI项目。 项目要求的一个功能是更新工艺类型。 工艺表包含craftTypeKey,craftTypeName和craftTypeDescription的列。 我需要更新列craftTypeName和craftTypeDescription。 我面临的问题是,从UI提供的行数是动态的。 它可以是一个数组(或一个列表)。 我正在使用SQL存储过程来执行数据库更新操作。 现在我正在使用SP来更新表格的一行,并在循环中调用SP,直到所有元素都更新。 我的方法的问题是,如果我在循环之间出现更新错误(出于某种原因),我无法通知UI部分,它们在更新时发生错误。 只有最后一个行更新状态提供给UI客户端(采用JSON格式)。 我需要更新web api输出,其中成功更新的行数和发生更新失败的行数。动态行号的sql更新
我用来执行数据库更新的代码如下。对于更新的工艺类型的API
ALTER PROCEDURE [dbo].[usp_UpdateCraftType]
@OrgKey INT,
@CraftTypeKey INT,
@CraftTypeName VARCHAR(50),
@CraftTypeDescription VARCHAR(128) AS
BEGIN
SET NOCOUNT ON;
DECLARE @rowcount1
BEGIN
UPDATE [dbo].[CraftTypes]
SET
[CraftTypeName][email protected]
,[CraftTypeDescription][email protected]
WHERE [email protected]
SET @rowcount1 = @@ROWCOUNT
IF @rowcount1 =0
SELECT -167;
ELSE
SELECT 167;
END
END
C#代码是
public PageViewModel UpdateCraftType(CraftTypes[] craftType)
{
objPageViewModel = new PageViewModel();
EmployeeAccessService emplAccess = new EmployeeAccessService();
for (int i = 0; i < craftType.Length; i++)
{
if (craftType[i] != null)
{
DataSet dsCraftTypeUpdateResult = new DataSet();
dsCraftTypeUpdateResult = emplAccess.UpdateCraftType(new { CraftTypeKey = craftType[i].CraftTypeKey, CraftTypeName = craftType[i].CraftTypeName, CraftTypeDescription = craftType[i].CraftTypeDescription });
if (dsCraftTypeUpdateResult != null && dsCraftTypeUpdateResult.Tables[0].Rows.Count > 0)
{
if (Convert.ToInt32(dsCraftTypeUpdateResult.Tables[0].Rows[0][0]) == 167)
{
objPageViewModel.FillPageViewModelObject(ResponseStatus.CraftTypeUpdated);
}
else
{
objPageViewModel.FillPageViewModelObject(ResponseStatus.CraftTypeUpdateFailure);
}
}
}
}
return objPageViewModel;
}
public DataSet UpdateCraftType(object model)
{
DataSet dsCraftTypeUpdated = new DataSet();
DatabaseModel dbModel = new DatabaseModel();
IDataAccess dataAceess = new DataAccessObject();
dbModel.CommandText = StoredProcedure.usp_UpdateCraftType;
dbModel.Params = model;
dsCraftTypeUpdated = dataAceess.GetData(dbModel);
return dsCraftTypeUpdated;
}
public DataSet GetData(DatabaseModel dbmodel)
{
string connectionstring = _context.Database.Connection.ConnectionString; //_context.Database.Connection.ConnectionString;
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionstring);
builder.ConnectTimeout = Convert.ToInt32(ConfigManager.GetAppSettingValue("ConnectionTimeOut"));
SqlConnection connection = new SqlConnection(builder.ConnectionString);
datahelper = new DataAccessHelper(connection);
SqlDataAdapter da = null;
DataSet ds = new DataSet();
connection.Open();
using (SqlCommand cmd = datahelper.GetCommandObject(dbmodel))
{
da = new SqlDataAdapter(cmd);
da.Fill(ds);
}
connection.Close();
return ds;
}
public class PageViewModel
{
public int StatusCode { get; set; }
public string StatusMessage { get; set; }
public int TotalCount { get; set; }
public object ModelObject { get; set; }
public PageViewModel FillPageViewModelObject(ResponseStatus statusCode_i, object modelObject_i = null)
{
this.StatusCode = (int)statusCode_i;
this.StatusMessage = EnumerationHelper.GetEnumDescription(statusCode_i);
this.ModelObject = modelObject_i;
return this;
}
}
感谢您的帮助.....
我认为你可以在这里使用事务,所以它会更新全部或失败,假设你不想在环路之间更新失败时部分更新记录。 –
我可以在哪里设置交易?由于存储过程是在C#循环内部调用的,因此它的作用域在sp的每次执行中都会得到正确的结果。 那么我如何识别sp的前一次执行是否已完成回滚? – Bimzee
你可以在SQL Server中设置事务,这篇文章可以帮助http://www.codeproject.com/Articles/4451/SQL-Server-Transactions-and-Error-Handling –