C# 如何在C上检查存储过程更新结果#

C# 如何在C上检查存储过程更新结果#,c#,stored-procedures,C#,Stored Procedures,在我继承的一些源代码中,有一段代码调用了进行更新的SQL存储过程 如果出现问题,存储过程将返回-1: IF @@Error <> 0 BEGIN ROLLBACK TRAN SELECT -1 RETURN END COMMIT TRAN SELECT 0 我还看到了相同代码的一部分,使用System.Data.DataSet()和Fill方法检查相同的内容。 是否有更优雅的方法检查返回值是否为-1? 在这种情况下使用

在我继承的一些源代码中,有一段代码调用了进行更新的SQL存储过程

如果出现问题,存储过程将返回-1:

IF @@Error <> 0
    BEGIN
        ROLLBACK TRAN
        SELECT -1
        RETURN
    END
COMMIT TRAN
SELECT 0
我还看到了相同代码的一部分,使用System.Data.DataSet()和Fill方法检查相同的内容。
是否有更优雅的方法检查返回值是否为-1?
在这种情况下使用ExecuteReader可以吗?

您是否尝试过使用?这是为返回单个值的查询而设计的:

执行查询,并返回 中第一行的第一列 查询返回的结果集。 添加了其他列或行 忽略


使用ExecuteOnQuery而不是读卡器,您将获得受影响的行数


你的问题不够清楚。您可能需要使用Lucero编写的返回值来执行此操作。

正如Jon正确指出的那样,您实际上没有使用SP的返回值,而是实际获取第一行的第一个值,这是
ExecuteScalar
以更简单的方式执行的操作

但是,为了从SP获取返回值(例如,从SP SQL代码中类似
return@i;
的内容),您需要添加一个新参数,并将其方向设置为
ReturnValue
,如下所示:

    System.Data.SqlClient.SqlDataReader myReader;
    try{
        SqlDbConnection.Open();
        SqlDbCommand.Connection = SqlDbConnection;
        SqlDbCommand.CommandType = System.Data.CommandType.StoredProcedure;
        SqlDbCommand.CommandText = "StoredProcedured_UpdateFoo";
        SqlDbCommand.Parameters.Clear();
        SqlDbCommand.Parameters.Add("@FooData", SqlDbType.DateTime); SqlDbCommand.Parameters["@FooData"].Value = System.DateTime.Now.ToString("yyyy-MM-dd");
        myReader = SqlDbCommand.ExecuteReader();   
        if (myReader.Read())
           {
             if (int.Parse(myReader.GetValue(0).ToString()) == -1) throw new ErrorDataTxRx("Error FOO ");
           }
    } finally {
      if (SqlDbConnection.State != ConnectionState.Closed){
           SqlDbConnection.Close();
      }

      if (myReader != null){              
          if (!myReader.IsClosed) myReader.Close();
      }
    }
SqlParameter returnValueParam = new SqlParameter();
returnValueParam.DbType = DbType.Int32;
returnValueParam.IsNullable = false;
returnValueParam.Direction = ParameterDirection.ReturnValue;
SqlDbCommand.Parameters.Add(returnValueParam);
// execute SP here...
int returnValue = (int)returnValueParam.Value;

-1.... 结果集的第一行与返回值完全不同。SP实际返回一个值(数字),可用于指示错误/状态信息。检查@TomTom处的SP调用语法:虽然这肯定是正确的,但请查看现有代码-它正在读取结果集的第一个值,就像填充
数据集一样。假设这就是OP想要的,我相信
ExecuteScalar
会做同样的事情,只是更简单。+1-为了不被OP使用的稍微不正确的术语弄糊涂。;)我已经添加了部分存储过程代码。如您所见,这是一个SELECT-1。@SystemPuntoot感谢您的编辑。因为它是关于代码检查的,所以我认为使用
selectsomeint
而不是SP返回值是一种不好的做法,会增加不必要的开销。