テーブルをプルダウンした後、新しいレコードを SqlDataReader にプッシュする方法はありますか? 変更が必要なゴミコードがありますが、これが必要なことを行う最も簡単な方法のようです。これを行うべきではないことは理解しています。もしそうしなければならない場合、あなたの論理には深刻な問題がありますが、方法はありますか?
4 に答える
SqlDataReaders は前方読み取り専用であるため、(テーブル全体をプルダウンしたかどうかに関係なく) レコードを追加できるとは思えません。実際、DbDataReader を継承するものはすべて前方読み取り専用です。
レコードを操作する必要があると思います。おそらく代わりにできることは、SqlDataReader を使用して DataTable を埋め、新しいレコードを DataTable に入れることです。ただし、DataTable を操作するには、コードを変更する必要があります。
その時点からの最も簡単な方法は、挿入のコマンド文字列を使用してコマンドを手動で作成することです(サニタイズ/クリーンデータでない場合はパラメーター化されます。とにかくそれを行うのが最善ですが、コードがかさばる可能性があります)。他のすべての設定が既に完了していることを考えると、そのためのコードは非常に小さいはずです。
"push a new record to" と言うとき、結果にレコードを追加したいということですか? それとも、INSERT を実行したいということですか?
INSERT はリーダーでは実行できません。ただし、リーダーを操作することはできます。もちろん、データを UNION するように元のクエリを更新する方が簡単です。
特に、独自の SqlDataReader を作成することはできませんが、独自の特注の IDataReader 実装を作成することはできます。これは SqlDataReader をラップし、SqlDataReader.Read() メソッドが false を返すまで内部 SqlDataReader からデータをプロキシするだけです。その後、独自のデータを返すように切り替え、データがなくなるまで true を返すことができます。実装するのは簡単ではありませんが (主に、独自の IDataReader を作成するために多くのメソッドを実装する必要があるため)、不可能ではないことは確かです。
質問を少し拡大する必要がありますが、
たとえば、100 万件のレコードを調べて、データを調べながら同じテーブルのフィールドを更新する必要があるとします。
データベースへの 2 番目の SqlConnection を作成し、テーブルで update ステートメントを実行できます (ロックの問題が発生しやすくなります)。または、すべての変更を一時テーブルに挿入し、リーダーでの作業が完了したら、変更を元のテーブルにマージすることをお勧めします。 .
このロジックの一部を単一の SQL UPDATE ステートメントに置き換えることはできますか?