[英]Stored procedure executes but does not update data
我在由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,我的历史回溯了几转-似乎我最近添加了一个附加字段,这打破了查询。 当我注释掉该字段并调用我的存储程序时,它可以正常工作。
不过,我不知道为什么-这只是一个varchar(255)字段。 在该数据库中,我还有许多其他字段以类似方式设置。 关于为什么会出现问题有任何想法吗?
编辑使用SQL事件探查器,我可以看到语句执行并提交...但是仍然没有数据更新。 我想知道是否需要废弃存储过程并重新开始?
在不使用.Net代码的情况下运行存储过程(即直接在SQL Server Management Studio中),并查看更改是否已更新。 可能您缺少显式的commit
语句。
尝试像这样设置CommandType
:
SqlCommand cmd = new SqlCommand("mystoredprocedure",myConnection)
cmd.CommandType = CommandType.StoredProcedure
听起来可能很愚蠢,但是如果您没有足够的磁盘空间,我已经看到SQL Server进行了一些动作,没有错误,但是您的数据没有得到保存。 也很容易检查!
尝试使用:
SqlCommand cmd;
cmd.CommandType = System.Data.CommandType.StoredProcedure;
或者您可以使用:
CALL mystoredprocedure(@ParameterName)
作为SQL文本
尝试这个 !
SqlCommand cmd = new SqlCommand(string.Format("mystoredprocedure('{0}')",inputValue),myConnection)
尝试直接从SQL SERVER运行sp并从存储过程中删除错误处理,以获取.Net中的确切错误。
您能为我尝试一件简单的事情吗?
更改您的存储过程以不接受任何参数。 将存储的proc的逻辑更改为仅在一张表中插入一行,然后更改代码以调用该过程并确定调用是否成功。
我认为您使用了错误的方式来调用存储过程。 ExecuteNonQuery返回的值-1是由于以下语句引起的:如果INSERT / UPDATE / DELETE,则该值是受影响的行数;如果存在回滚,则返回-1。 在所有其他情况下,返回值为-1(我认为您的情况是)。
与两个参数SqlCommand(String,SqlConnection)一起使用的SqlCommand构造函数需要第一个是通用查询,因此您可以运行“ exec myProcedure @ par1”之类的东西,并且可以设置参数,例如:
Dim par1 As New SqlParameter("@par1", SqlDbType.VarChar, 50)
par1.Value = "DummyValue"
cmd.Parameters.Add(par1)
但是,在理想情况下,与调用CommandType设置为“ StoredProcedure”相比,您必须调用存储的方法,例如MSDN在此链接中建议http://msdn.microsoft.com/it-it/library/ yy6y35y8.aspx 。
(我会告诉你VB代码...抱歉..它很容易转换为C#与像工具这样 。)
如果要从运行的存储过程中读取值,则可以使用SqlAdapter填充数据(例如,“ ds”)-这仅是一个示例-:
Dim da As New SqlDataAdapter(cmd)
da.Fill(ds, "result")
If ds.Tables.Item("result").Rows.Count > 0 Then
Return True
Else
Return False
End If
如果您不需要阅读任何内容,则可以简单地使用:
cmd.ExecuteNonQuery()
当然,您必须告诉您要启动存储过程:
cmd.CommandType = CommandType.StoredProcedure
希望对您有用...
再见,马西莫。
我认为您在创建Command对象时缺少Command Type。将Command Object的Command Type设置为StoreProcegure,然后再次检查。由于U如果未设置Command Type,则ur查询执行,但是您也不会得到任何错误和所需的结果。
从代码中,我可以看到您要传递的参数名称与过程中使用的参数名称不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.