私はたくさんの同様のレコードをテーブルに挿入する必要があり、これを行うための良い/簡単な方法があるかどうか疑問に思いました。
大きな弦を作るのは簡単だと思いますが、もっと優雅な方法を見つけられるといいなと思っていました。
このSqlBulkCopy
クラスにはWriteToServer
、複数のレコードを書き込むメソッドがあります。
インターフェイスを実装するクラスを作成しました。このクラスをIDataReader
パラメーターとしてSqlBulkCopy.WriteToServer
メソッドに渡すことができます(インターフェイスの実装方法の例については、ADO.NET:.NETデータアクセスフレームワークで使用するカスタムデータプロバイダーの構築IDataReader
を参照してください)。
実装するよりも簡単な方法があるかもしれませんIDataReader
(つまり、他のSqlBulkCopy.WriteToServer
方法の1つを使用することによって)。
一般的な経験則は、挿入ごとに接続を開いたり閉じたりしたくないということだと思います。当たり前のように聞こえるかもしれませんが、私はこの問題を 2 回目撃しましたが、どちらも SQL サーバーで発生しました。ループ内で、私が修正したコードは、各挿入で接続を開いたり閉じたりする外部クラス ライブラリを呼び出しました。忙しい日には、接続プールがいっぱいになり、例外が暴走しました。接続を確立できなかったため、他のアプリケーションでもエラーが発生しました。もちろん、修正は、ループの前に接続を開き、ループ内で ExecuteNonQuery() 関数を (何度も) 呼び出し、ループの後に接続を閉じることでした。些細なことのように思えますが、これは本当によくある間違いです。
よろしくお願いします...
データがCsvまたはXMLで保存されている場合は、SQLサーバーでレコードをインポートできます(SQLサーバーを使用している場合)。
ソース データがテキスト ファイル (CSV または読み取り可能な標準) にある場合は、StreamReader を使用して各行を読み取り、その行を取得して単一の挿入ステートメントに変換する関数を使用します。あとは飛ばすだけ
たとえば、次のようなファイルがあるとします。
foo 1
bar 2
baz 3
...
using(StreamReader sr = new StreamReader(File.Open("sourcefile.txt", FileMode.Open)))
{
using(SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
string line ="";
while((line = sr.ReadLine()) != "")
{
string[] parts = line.split(new string[]{" "}, StringSplitOptions.None);
string cmdTxt = String.Format("INSERT INTO MyTable(name, value) VALUES('{0}','{1}')", parts[0], parts[1]);
using(SqlCommand cmd = new SqlCommand(cmdTxt, conn))
{
cmd.ExecuteNonQuery();
}
}
}
}