我在 ASP.NET / C# 代码访问的 SQL Server 2005 数据库中有一个存储过程。
存储过程的参数以典型方式定义:
Try
{
SqlCommand cmd = new SqlCommand("mystoredprocedure",myConnection)
cmd.Parameters.Add(new SqlParameter("@p1"), SqlDbType.Int))
cmd.Parameters["@p1"].Value = myvalue (usually form inputs)
.
.
.
myConnection.Open()
cmd.ExecuteNonQuery()
}
catch (Exception xx)
{
lblError.Text = xx.Message;
}
finally
{
myConnection.Close();
}
问题是我的数据永远不会更新,尽管存储过程不会引发任何错误。我检查了 SQL Server 中的过程,当我直接通过 SQL Server 调用它时,proc 会进行更新。
我正在把头发扯下来,因为它工作了很长时间,然后停止工作。我检查了通常的罪魁祸首(数据库连接指向正确的数据库,该过程似乎在 SQL Server 中运行良好,并且我已经注释掉了我创建的几个新参数)
关于可能导致这种情况的任何想法?奇怪的是,相同的过程在 SQL Server 中有效,但不能通过我的代码而不抛出任何错误。(可以肯定的是,我在存储过程中放了一个返回值,返回值表示我没有回滚)
编辑
存储过程的代码:
BEGIN TRANSACTION
--get count
update dbo.myTable set
val1=@val1,
val2=@val2,
.
.
.
WHERE ID=@MyID
SET @Err = @@ERROR
--if error rollback transaction
IF @Err <> 0
BEGIN
ROLLBACK TRANSACTION
GOTO ErrorHandler
END
Select @ReturnCode = 1
COMMIT TRANSACTION
RETURN
ErrorHandler:
--unknown error
Select @ReturnCode = 0
RAISERROR (@Err, 16, 1 ) WITH LOG
RETURN -100
编辑
当我解析 cmd.ExecuteNonQuery 时,结果是 -1。仍在试图弄清楚为什么 C# 代码会这样做但没有抛出任何错误。ExecuteNonQuery 不应该返回受存储过程影响的行数吗?
编辑
使用 TFS,我在我的历史中倒退了几轮 - 似乎我最近添加了一个额外的字段,它破坏了查询。当我注释掉该字段并调用我的 sproc 时,它工作正常。
不过,我不明白为什么 - 它只是一个 varchar(255) 字段。我在这个数据库中有很多其他字段以类似的方式设置。关于为什么这会是一个问题的任何想法?
编辑 使用 SQL Profiler,我可以看到语句执行并提交......但仍然没有数据更新。我想知道我是否需要丢弃 sproc 并重新开始?