【问题标题】:Trying to load second result set from a stored procedure尝试从存储过程加载第二个结果集
【发布时间】:2012-12-02 16:13:24
【问题描述】:

我有一个客户设置,它使用存储过程从其 SQL Server 数据库返回数据。

这些存储过程都是以相同的方式构建的——它们接受一堆输入参数,然后返回:

  • 第一个只是单行单列,带有结果代码(键入INT)- 0 表示成功,其他一些值;如果值为 0,则有第二个结果集包含实际数据

  • 第二个结果集可以是任何东西 - 任意数量的列和行

我正在尝试创建一种“通用”方式来与该系统交互,我的尝试是这样的:

  • 创建一个接受存储过程名称和输入参数的类
  • 既包含ErrorCode INT 属性又包含DataTable results 属性的返回类型

但是,我无法让它与 ADO.NET 和 SQL Server 2008 R2 一起使用。

我的代码归结为:

public MyResultType CallService(string procedureName, MyParameters parameters)
{
     MyResultType result = new MyResultType { ErrorCode = 0 };

     using (SqlConnection conn = new SqlConnection(_connectionString))
     using (SqlCommand cmd = new SqlCommand(procedureName, conn))
     {
         cmd.CommandType = CommandType.StoredProcedure;
         SetupParameters(cmd, parameters);

         // open connection, execute the stored procedure
         conn.Open();

         using (SqlDataReader rdr = cmd.ExecuteReader())
         {
             // get the first result set - the status code, one row, one column of type INT
             while (rdr.Read())
             {
                 result.ErrorCode = rdr.GetInt32(0);
             }

             // if we got a "0" (success) -> go to the next result set and load it into the table
             if(result.ErrorCode == 0 && rdr.NextResult())
             {
                 result.ResultTable = new DataTable();
                 result.ResultTable.Load(rdr);

                 int colCount = result.ResultTable.Columns.Count;
                 int rowCount = result.ResultTable.Rows.Count;
              }

              rdr.Close();
         }

         conn.Close();
   }

   return result;
}

我的问题是:对存储过程的调用工作正常,错误代码 = 0 被拾取就好了,创建了数据表并且列数是预期值 - 但是有 NO ROWS 已加载...

我一直在尝试一切我能想到的将这些行放入 DataTable 的方法 - 不走运。当然 - 如果我在 SQL Server Management Studio 中执行同样的存储过程,一切正常,我得到 ErrorCode=0 和 18 列和 5 行的结果集 - 没问题....

我错过了什么?谁能在我的代码中发现问题?为什么没有加载第二个结果集的行(但似乎正在检测列)?

【问题讨论】:

  • 列数是预期值并且“结果”表是正确创建的(没有行除外)这一事实表明,从“控制台”调用存储过程的方式存在一些差异"(SQL Server Management Studio)和来自您的 ADO.Net 代码。特别是存储过程采用哪些参数?您在上面代码的 sn-p 中引用而不将它们公开为“参数”。
  • 应该能够通过运行探查器跟踪来检查这一点

标签: sql-server stored-procedures ado.net sql-server-2008-r2 multiple-resultsets


【解决方案1】:

发布的代码运行良好 - 我在 C# 和 SQL Server Management Studio 中调用它的方式有所不同:NULL 处理。

我将一些输入参数设置为int,因此为存储过程提供了0 值,而如果未定义该值,它确实希望得到NULL......

愚蠢的新手错误......对不起,伙计们!感谢您的投入!

【讨论】:

    【解决方案2】:

    DataTable.Load method 隐式调用 NextResult 方法,因此将其与您的显式调用相结合,它正在推进到不存在的结果集。如果您想使用 DataTable.Load 循环并自己填充数据表,则应删除自己对 NextResult 的调用。

    【讨论】:

    • DataTable.Load calls NextResult 它加载了它的结果集....如果我不把.NextResult()放在那里,那么我正在加载第一个结果集(只有一行,一列)。我已经测试过了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多