ストアド プロシージャから 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 の設定の間に手動処理を行うにはどうすればよいですか?