使用 C# 事务时将输出参数值作为 DBNULL
本文关键字:DBNULL 参数 输出 事务 使用 | 更新日期: 2023-09-27 18:31:22
>存储过程,插入到表中,该表的标识列作为 ID
CREATE PROCEDURE InsertValue
@Value varchar(7),
@NewId int = 0 OUTPUT
AS
BEGIN
IF(NOT EXISTS(SELECT 1 FROM [Table1] WHERE Detail = @Value))
BEGIN
INSERT into [Table1] (Detail)
VALUES (@Value)
SET @NewId = SCOPE_IDENTITY();
END
END
C# 代码:
int newId=0;
SqlTransaction SqlTrans = null;
SqlConnection con = new SqlConnection("connection string");
con.Open();
cmd = new SqlCommand("InsertValue", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@Value", "123"));
SqlParameter parId= new SqlParameter("@NewId",DbType.Int32);
parId.Value= 0;
parId.Direction = ParameterDirection.Output;
cmd.Parameters.Add(parId);
SqlTrans = con.BeginTransaction();
cmd.Transaction = SqlTrans;
try
{
cmd.ExecuteNonQuery();
// parId.Value is DBNULL
SqlTrans.Commit();
newId = Convert.ToInt32(parId.Value);
// Exception : This SqlTransaction has completed; it is no longer usable
}
catch (Exception e)
{
throw;
}
那么谁能帮我解决这个问题?我希望事务存在于 C# 代码中,但需要 out 参数的值。
如果我在提交事务之前访问该值,则它是DBNull
的,如果在提交后访问,则在转换时出现异常(该值仍然是DBNull)
此 SqlTransaction 已完成;它不再可用。
看看这些现有问题的答案,This SqlTransaction has completed; it is no longer usable
.也许您的存储过程已经提交事务,或者 SQL Server 由于某种原因正在终止事务?
"此 SqlTransaction 已完成;它不再可用。配置错误?
SQL事务已完成
感谢大家的支持和帮助。实际上,问题出在输出参数的默认值上。我忘了在问题中指定条件(现在我已经添加了它),这会阻止每次设置输出参数的值。由于我每次都将输出参数值传递为 0,因此当它在 SP 中未设置时应该是 0。但是,输出参数作为 DBNull 获取,以防未在过程中设置。因此,我更改了每次设置参数值的过程,而不考虑条件。
CREATE PROCEDURE InsertValue
@Value varchar(7),
@NewId int = 0 OUTPUT
AS
BEGIN
SET @NewId = 0; -- Added to set it to 0
IF(NOT EXISTS(SELECT 1 FROM [Table1] WHERE Detail = @Value))
BEGIN
INSERT into [Table1] (Detail)
VALUES (@Value)
SET @NewId = SCOPE_IDENTITY();
END
END