DataTableがあり、すべてをデータベーステーブルにプッシュする必要があります。
foreachを使用して、各行を一度に挿入することで、すべてをそこに入れることができます。ただし、数千行あるため、これは非常に遅くなります。
より高速になる可能性のあるデータテーブル全体を一度に実行する方法はありますか?
DataTableの列はSQLテーブルよりも少なくなっています。それらの残りはNULLのままにしておく必要があります。
DataTableがあり、すべてをデータベーステーブルにプッシュする必要があります。
foreachを使用して、各行を一度に挿入することで、すべてをそこに入れることができます。ただし、数千行あるため、これは非常に遅くなります。
より高速になる可能性のあるデータテーブル全体を一度に実行する方法はありますか?
DataTableの列はSQLテーブルよりも少なくなっています。それらの残りはNULLのままにしておく必要があります。
SqlBulkCopy はこれを行う簡単な方法であり、SQL Server でストアド プロシージャを記述する必要がないことを発見しました。
これが私がそれをどのように実装したかの例です:
// take note of SqlBulkCopyOptions.KeepIdentity , you may or may not want to use this for your situation.
using (var bulkCopy = new SqlBulkCopy(_connection.ConnectionString, SqlBulkCopyOptions.KeepIdentity))
{
// my DataTable column names match my SQL Column names, so I simply made this loop. However if your column names don't match, just pass in which datatable name matches the SQL column name in Column Mappings
foreach (DataColumn col in table.Columns)
{
bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
}
bulkCopy.BulkCopyTimeout = 600;
bulkCopy.DestinationTableName = destinationTableName;
bulkCopy.WriteToServer(table);
}
既に DataTable があり、SQL Server 2008 以降を使用していると想定しているため、これがおそらく最も簡単な方法です。まず、データベースに次の 2 つのオブジェクトを作成します。
CREATE TYPE dbo.MyDataTable -- you can be more speciifc here
AS TABLE
(
col1 INT,
col2 DATETIME
-- etc etc. The columns you have in your data table.
);
GO
CREATE PROCEDURE dbo.InsertMyDataTable
@dt AS dbo.MyDataTable READONLY
AS
BEGIN
SET NOCOUNT ON;
INSERT dbo.RealTable(column list) SELECT column list FROM @dt;
END
GO
C# コードで次のようにします。
DataTable tvp = new DataTable();
// define / populate DataTable
using (connectionObject)
{
SqlCommand cmd = new SqlCommand("dbo.InsertMyDataTable", connectionObject);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter tvparam = cmd.Parameters.AddWithValue("@dt", tvp);
tvparam.SqlDbType = SqlDbType.Structured;
cmd.ExecuteNonQuery();
}
質問にもっと具体的な詳細を記載していただければ、より具体的な回答ができたのに。
これは、テーブル値パラメーターを使用して行うことができます。
次の記事をご覧ください。
http://www.codeproject.com/Articles/39161/C-and-Table-Value-Parameters