ストアド プロシージャを使用して 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 番目の結果セットの行がロードされないのはなぜですか (ただし、列は検出されているようです)。