使用 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 已完成;它不再可用。

使用 C# 事务时将输出参数值作为 DBNULL

看看这些现有问题的答案,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