4

ストアド プロシージャを使用して SQL Server データベースからデータを返す顧客のセットアップがあります。

これらのストアド プロシージャはすべて同じ方法で作成されます。これらは一連の入力パラメータを受け取り、以下を返します。

  • 1 つ目は、結果コード (type ) を含む単一の行、単一の列INTです。成功の場合は 0、それ以外の場合はその他の値です。値が 0 の場合、実際のデータを含む 2 番目の結果セットがあります

  • 2 番目の結果セットは何でもかまいません - 任意の数の列と行

私はこのシステムとやり取りするための「一般的な」方法を作成しようとしています。私の試みは次のとおりです。

  • ストアド プロシージャ名と入力パラメータを受け取るクラスを作成する
  • プロパティ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 が正常に取得され、データテーブルが作成され、列の数が期待値であるということです-しかし、ロードされた行はありません...

これらの行を DataTable に入れるために考えられるすべてのことを試みてきましたが、うまくいきませんでした。そしてもちろん、このまったく同じストアド プロシージャを SQL Server Management Studio で実行すると、すべて正常に動作し、ErrorCode=0 と 18 列と 5 行の結果セットが得られます。問題ありません....

私は何が欠けていますか?誰でも私のコードの問題を見つけることができますか? 2 番目の結果セットの行がロードされないのはなぜですか (ただし、列は検出されているようです)。

4

2 に答える 2

4

公開されたコードは正常に動作します - C# から呼び出す方法と SQL Server Management Studio で呼び出す方法に違いがありました: NULL 処理。

いくつかの入力パラメーターを設定して、ストアド プロシージャに値をint提供しましたが、値が定義されていない場合0に取得することを実際に期待していましたNULL......

ばかげた新人ミス.....申し訳ありません!そして、ご意見ありがとうございます!

于 2012-12-02T19:30:30.660 に答える
1

DataTable.Load メソッドは暗黙的に NextResult メソッドを呼び出すため、それを明示的な呼び出しと組み合わせると、存在しない結果セットに進みます。DataTable.Load を使用するか、ループスルーして自分でデータテーブルを埋めたい場合は、NextResult への独自の呼び出しを削除する必要があります。

于 2012-12-02T16:18:52.200 に答える