存储过程执行但不更新数据

时间:2013-08-14 13:44:14

标签: c# asp.net sql-server sql-server-2005

我在SQL Server 2005数据库中有一个存储过程,该数据库由ASP.NET / C#代码访问。

存储过程的参数以典型方式定义:

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事件探查器,我可以看到语句执行并提交...但仍然没有数据更新。我想知道我是否需要把垃圾桶丢弃并重新开始?

10 个答案:

答案 0 :(得分:4)

运行不带.Net代码的存储过程(即直接在SQL Server Management Studio中),并查看更改是否更新。可能你错过了明确的commit陈述。

答案 1 :(得分:1)

尝试像这样设置CommandType

SqlCommand cmd = new SqlCommand("mystoredprocedure",myConnection)
cmd.CommandType = CommandType.StoredProcedure

答案 2 :(得分:1)

可能听起来很愚蠢,但是如果你的磁盘空间不足我已经看过SQL服务器通过动作,没有错误,但你的数据没有被保存。也很容易检查!

答案 3 :(得分:0)

尝试使用:

SqlCommand cmd;
cmd.CommandType = System.Data.CommandType.StoredProcedure;

或者您可以使用:

CALL mystoredprocedure(@ParameterName)

as SQL-Text

答案 4 :(得分:0)

试试这个!

SqlCommand cmd = new SqlCommand(string.Format("mystoredprocedure('{0}')",inputValue),myConnection)

答案 5 :(得分:0)

尝试直接从SQL SERVER运行sp并从存储过程中删除错误处理以获取.Net中的确切错误。

答案 6 :(得分:0)

你能为我尝试一件简单的事吗?

更改存储过程以不接受任何参数。更改存储过程的逻辑只是在一个表中插入一行,然后更改您的代码以调用该过程并查明调用是否成功。

答案 7 :(得分:0)

我认为您使用错误的方法来调用存储过程。 ExecuteNonQuery返回的值-1是因为语句:如果INSERT / UPDATE / DELETE值是受影响的行数,则返回-1,如果有回滚。在所有其他情况下,返回值为-1(我认为你的情况)。

SqlCommand构造函数与两个参数一起使用时SqlCommand(String,SqlConnection)需要第一个是通用查询,因此您可以运行类似“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代码......对不起......用this之类的工具很容易转换为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

希望对你有用......

再见,马西莫。

答案 8 :(得分:0)

我认为你在创建Command对象时缺少命令类型。将命令对象的命令类型设置为StoreProcegure然后再次检查..因为如果你不设置命令类型那么你的查询执行但你不会得到任何错误和所需的结果还

答案 9 :(得分:0)

从您的代码中我可以看到您传递的参数名称与您在程序中使用的参数名称不同。