32

DataTableがあり、すべてをデータベーステーブルにプッシュする必要があります。

foreachを使用して、各行を一度に挿入することで、すべてをそこに入れることができます。ただし、数千行あるため、これは非常に遅くなります。

より高速になる可能性のあるデータテーブル全体を一度に実行する方法はありますか?

DataTableの列はSQLテーブルよりも少なくなっています。それらの残りはNULLのままにしておく必要があります。

4

6 に答える 6

66

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);
}
于 2013-11-20T22:55:39.157 に答える
31

既に 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();
}

質問にもっと具体的な詳細を記載していただければ、より具体的な回答ができたのに。

于 2012-05-01T23:08:59.807 に答える
0

これは、テーブル値パラメーターを使用して行うことができます。

次の記事をご覧ください。

http://www.codeproject.com/Articles/39161/C-and-Table-Value-Parameters

于 2012-05-01T22:43:07.200 に答える