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

时间:2016-01-22 08:01:58

标签: c# sql-server transactions

存储过程,插入到表中,其标识列为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已完成;它不再可用了。

2 个答案:

答案 0 :(得分:0)

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

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

SqlTransaction has completed

答案 1 :(得分:0)

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