0

我在 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 并重新开始?

4

10 回答 10

4

Run the stored procedure without the .Net code (i.e directly in SQL Server Management Studio) and see whether the changes are updated or not. Probably you are missing an explicit commit statement.

于 2013-08-14T13:48:55.740 回答
2

听起来可能很愚蠢,但是如果您的磁盘空间不足,我已经看到 SQL Server 完成这些动作,没有错误,但您的数据不会被保存。检查也很方便!

于 2013-08-29T19:00:45.107 回答
1

Try to set CommandType like that :

SqlCommand cmd = new SqlCommand("mystoredprocedure",myConnection)
cmd.CommandType = CommandType.StoredProcedure
于 2013-08-14T13:48:36.117 回答
0

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

于 2013-08-29T09:28:05.547 回答
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 代码......对不起......它很容易使用这样的工具转换为 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

希望对你有用...

再见,马西莫。

于 2013-08-28T15:53:20.257 回答
0

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

于 2013-08-26T18:34:18.587 回答
0

尝试这个 !

SqlCommand cmd = new SqlCommand(string.Format("mystoredprocedure('{0}')",inputValue),myConnection)
于 2013-08-26T10:17:04.707 回答
0

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

更改您的存储过程以不接受任何参数。将存储过程的逻辑更改为仅在一张表中插入一行,然后更改代码以调用该过程并确定调用是否成功。

于 2013-08-28T14:36:08.907 回答
0

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

于 2013-08-28T16:20:51.270 回答
0

尝试使用:

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

或者你可以使用:

CALL mystoredprocedure(@ParameterName)

作为 SQL 文本

于 2013-08-14T13:47:33.610 回答