存储过程,插入到表中,其标识列为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已完成;它不再可用了。
答案 0 :(得分:0)
查看This SqlTransaction has completed; it is no longer usable
这些现有问题的答案。也许您的存储过程已经提交了事务,或者SQL Server因某种原因而终止了事务?
"This SqlTransaction has completed; it is no longer usable."... configuration error?
答案 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