C# C语言中的更新错误处理#
我在sqlserver中有一个customer表,其中包含一个C# C语言中的更新错误处理#,c#,sql-server,C#,Sql Server,我在sqlserver中有一个customer表,其中包含一个rowversion字段,每次更新记录时,我都会将其递增, 我只是想和你核实一下 if(Customer.rowversion=@roeversion ) where customerID=@customerID 执行更新 else RAISERROR('Update cannot be executed. There is a row version conflict.', 16, 1) 因此,现在必须从我的c#代码中传递一个参
rowversion
字段,每次更新记录时,我都会将其递增,
我只是想和你核实一下
if(Customer.rowversion=@roeversion ) where customerID=@customerID
执行更新
else RAISERROR('Update cannot be executed. There is a row version conflict.', 16, 1)
因此,现在必须从我的c#代码中传递一个参数并返回错误值。而且
-获取刚刚执行的语句的错误代码
SELECT @ErrorCode=@@ERROR
那么,我应该如何将SQLSERVER更新查询中的值返回到我的c#代码中,以便显示消息。如果您通过ado.NET调用存储过程,那么传递给存储过程的SqlParameter将如下设置:
SqlParameter P = new SqlParameter("Name of your column", SqlDbType.Int);
P.Direction = ParameterDirection.Output;
//call your sproc
int result = (int)P.Value;
编辑
由于您使用的是Linq to SQL,因此将此存储过程添加到“方法”部分应该会为此存储过程创建一个c方法签名,并为您添加out参数如果尚未添加,则应将数据库代码保存在存储过程中。存储过程看起来像:
CREATE PROCEDURE s_my_procedure
@RowVersion int ,
@CustomerID int ,
... additional fields here
@ErrorCode INT OUTPUT
AS
IF EXISTS(SELECT 1
FROM Customer
WHERE RowVersion = @RowVersion
AND CustomerID = @CustomerID)
BEGIN
UPDATE Customer
SET ...
WHERE RowVersion = @RowVersion
AND CustomerID = @CustomerID
SET @ErrorCode = 0
END
ELSE
BEGIN
SET @ErrorCode = 1234 -- Something meaningful to your app
END
您应该尽可能避免引起错误
然后,假设您有一个由命令执行的存储过程:
cmd.ExecuteNonQuery();
int ErrorCode = 0;
// Note that if you are not sure about your sp, you should test this for dbnull.value first
ErrorCode = Convert.ToInt32(cmd.Parameters["@ErrorCode"].Value);
我通过DBML db.usp_UpdateCustomer调用存储过程(CustomerID、FirstName、MiddleName、LastName、Title、Active、SeeNote、UserId、RowVersion);那么在这种情况下,我应该如何返回。哦!如果您使用的是LINQtoSQL,那么当您将存储过程加载到方法资源管理器中时,它应该为您定义一个out参数,您能告诉我怎么做吗that@user1078389-这个链接应该对你来说是个好消息!记住,如果一个答案解决了或者帮助你解决了你的问题,你应该点击答案旁边的复选标记和向上箭头,让未来的访问者知道它帮助了你。我还有一件事要问。。。要返回的实际错误代码值应该是多少。如果该值大于1200,或者sql错误将返回负值,那么如何处理该值??错误代码可以是您想要的任何值,因为它没有经过sql Server异常处理过程。我们的做法是使用负数表示错误,正数表示警告,但您可以选择任何您想要的方案。