繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM