代码之家  ›  专栏  ›  技术社区  ›  systempuntoout

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

  •  4
  • systempuntoout  · 技术社区  · 14 年前

    查看我继承的一些源代码,有一段代码调用一个SQL存储过程进行更新。

    如果发生错误,存储过程将返回-1:

    IF @@Error <> 0
        BEGIN
            ROLLBACK TRAN
            SELECT -1
            RETURN
        END
    COMMIT TRAN
    SELECT 0
    

    C代码是这样的:

        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();
          }
        }
    

    我还看到了相同代码的一部分,使用带有fill方法的system.data.dataset()检查相同的内容。
    是否有更优雅的方法来检查返回值是否为-1?
    在这种情况下,可以使用ExecuteReader吗?

    3 回复  |  直到 6 年前
        1
  •  6
  •   Jon Skeet    14 年前

    你试过用吗 ExecuteScalar ?它是为返回单个值的查询而设计的:

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

        2
  •  3
  •   Lucero    14 年前

    正如jon正确指出的,实际上您没有使用sp的返回值,而是实际获得第一行的第一个值,这就是 ExecuteScalar 以一种简单的方式。

    但是,为了从SP获取返回值(例如从 RETURN @i; 在sp sql代码中,需要添加一个新参数并将其方向设置为 ReturnValue ,如下所示:

    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;
    
        3
  •  0
  •   ibram    14 年前

    使用executeNonQuery而不是读卡器,您将得到受影响的行数。

    你的问题不够清楚。您可能需要像Lucero所写的那样使用返回值。

    推荐文章