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

Getting the output parameter value as DBNULL when using C# transaction

存储过程,插入到 table,它有一个标识列作为 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)

This SqlTransaction has completed; it is no longer usable.

查看 This SqlTransaction has completed; it is no longer usable 这些现有问题的答案。也许您的存储过程已经提交了事务,或者 SQL 服务器出于某种原因正在终止事务?

"This SqlTransaction has completed; it is no longer usable."... configuration error?

SqlTransaction has completed

感谢大家的支持和帮助。 实际上问题出在输出参数的默认值上。 我忘记在问题中指定条件(现在我已经添加了它),这阻止了每次设置输出参数的值。 因为我每次都将输出参数值传递为 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