7


3

C#テーブルデータをSQL Serverテーブルに挿入する

とにかく、ストアプロシージャを使用してこのテーブルをパラメーターとして渡して、C#のSystem.Data.DataTableをSQL Serverテーブルに一括挿入する方法はありますか。

テーブルには固定数のレコードがありません。

2 Answer


6


はい、あります。

        DataTable dataTable = null; // your data needs to be here
        try
        {
            ConnectionStringSettings mConString = ConfigurationManager.ConnectionStrings["SiteSqlServer"];

            // Optional truncating old table
            using (SqlConnection connection = new SqlConnection(mConString.ConnectionString))
            {
                connection.Open();
                // Delete old entries
                SqlCommand truncate = new SqlCommand("TRUNCATE TABLE MYTABLE", connection);
                truncate.ExecuteNonQuery();
            }

            SqlBulkCopy bulkCopy = new SqlBulkCopy(mConString.ConnectionString, SqlBulkCopyOptions.TableLock)
                                          {
                                              DestinationTableName = "dbo.MYTABLE",
                                              BatchSize = 100000,
                                              BulkCopyTimeout = 360
                                          };
            bulkCopy.WriteToServer(dataTable);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }

BatchSizeを試してみてください-100000は私にとっては良いことでした-それより大きくてはいけません-そうでなければ速度の移行が減少します。 BatchSizeはデータを制限しません。SQLサーバーに送信される各「パケット」のサイズだけです。

SiteSQLServerはapp.configまたはweb.config内にある必要があります。 そうでない場合は、ここでパラメータを変更する必要があります。

MYTABLEをテーブル名に変更してください。


2


2008年以前のSQL Serverバージョンでは、DataTable全体をSQL Serverにプッシュする唯一の方法はhttp://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx[SqlBulkCopy]でした。 すべてのデータを(おそらく一時的な)ステージングテーブルにプッシュし、プロシージャを呼び出してステージングされたデータを処理する必要があります。

SQL Server 2008では、テーブル値のユーザー定義型が導入されました。 これらは、データのセットを操作するためのいくつかの素晴らしい新しいオプションを提供します。

MSDNをご覧ください。

おそらく私のブログ記事の2つで1秒です。