4

ストアド プロシージャから DataSet インスタンスを埋める通常推奨される方法は、SqlDataAdapter.Fill(DataSet) を使用することです。私が見つけることができたすべての答えは、箱から出してすぐに使用するように言っています. 私は通常それを認めます、それはうまくいきます。

ただし、ストアド プロシージャの出力と DataSet の入力の間でデータの処理を行う必要がある場合は、うまくいきません。具体的には、出力でカスタム CLR 型を使用する場合、CLR を使用する列の列インデックス (テーブルの 1 つ。列インデックスが参照するテーブルを特定する明白な方法はないようです) がInvalidOperationException: DataReader.GetFieldType(n) returned null.どこにあるかで壊れます。nその出力を入力します。読者は問題の列にどのような種類のデータがあるのか​​ わからないため、これは理解できます。

CLR 型の逆シリアル化ロジックを分割して両方の場所で使用できますが、 Fill() が壊れる前にそのような逆シリアル化メソッドを呼び出す時間ないようです。

については知ってSqlCommand.ExecuteReader()いますが、そのテーブルから 1 つのテーブルしか取得できないようです。

問題の CLR 型は、コア システム フィールドの 1 つ (現在は自由形式のテキストとして格納されています) をもう少し厳密なものに置き換えるように設計されています。データベースを調べて、そのようなフィールドの返されたすべてのインスタンスにメソッド呼び出しを追加するという問題は、可能性として議論されてきましたが、間違いなく重要な作業量です。そのため、代わりに DAL で変換を行うことができ (そのような列をプログラムで識別できることのみが必要であり、これは実行可能です)、ストレージをクライアントに対して透過的にし、データのクライアントの使用をデータベースに対して引き続き透過的にすることができると考えられていまし

したがって、SqlDataAdapter.Fill() を使用せずに、ストアド プロシージャ出力のすべてのテーブルにアクセスするにはどうすればよいですか? または、SqlDataAdapter.Fill() の実行にフックして、SP の実行と DataSet の設定の間に手動処理を行うにはどうすればよいですか?

4

2 に答える 2

2

を使用して複数のテーブルを選択できますDataReaderreader.NextResultより多くの結果セットがあるかどうかを確認し、データリーダーをそれに進めるために使用できます。

using (var con = new SqlConnection(Properties.Settings.Default.ConnectionString))
{
    using (var cmd = new SqlCommand("StoredProcedureName", con))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        int rowCount = 0;
        con.Open();
        using (IDataReader rdr = cmd.ExecuteReader())
        {
            while (rdr.Read())
            {
                Console.WriteLine("Object 1 in Row {0}: '{1}'", ++rowCount, rdr[0]);
            }
            if (rdr.NextResult())
            {
                rowCount = 0;
                while (rdr.Read())
                {
                    Console.WriteLine("Object 1 in Row {0}: '{1}'", ++rowCount, rdr[0]);
                }
            }
        }
    }
}
于 2012-11-12T09:16:16.677 に答える
0

実際は思ったより簡単だったようです。ティム・シュメルターの答えは私を実験に導きましたが、本当のトリックは単純に CLR 型アセンブリを DAL プロジェクトに追加することでした。その後、すべてが適切に機能しましたSqlDataAdapter.Fill(DataSet); 突然、SQL Server から受信したバイナリ データをどう処理するかがわかりました。明らかに (検証されていませんが、もっともらしい) 型のToString(). DAL コードが別の場所で使用される DataSet を作成したときに何が起こるかはまだ確認していませんが、これら 2 つの間に実用的なソリューションを考え出すことは可能だと思います。

于 2012-11-23T11:52:37.067 に答える