あなたがC#アプリケーションで独自の転送メカニズムを実装することを決定し、あなたが本当に大量のデータで作業している場合は、この方法を選択するように注意してくださいSQL Serverに行単位でデータを挿入することはありません。明らかに
OdbcDataReader rdrAccess = cmdAccess.ExecuteReader();
while (rdrAccess.Read())
{
// insert a row into SQL Server
}
のようなアプローチは、ほぼ確実に遅くなりますが、
using (var cmd = new OdbcCommand())
{
cmd.Connection = connAccess;
cmd.CommandText =
$"INSERT INTO [ODBC;{connStrSqlOdbc}].[BulkTable] (id, txtcol) " +
$"SELECT ID, TextField AS txtcol FROM Table1 WHERE ID<=1000";
cmd.ExecuteNonQuery();
}
のようにも単一のAccess SQLステートメントは、フォームの1000年の個々のT-SQL文
exec sp_executesql N'INSERT INTO "dbo"."BulkTable" ("id","txtcol") VALUES (@P1,@P2)',N'@P1 int,@P2 nvarchar(50)',1,N'record000000'
exec sp_executesql N'INSERT INTO "dbo"."BulkTable" ("id","txtcol") VALUES (@P1,@P2)',N'@P1 int,@P2 nvarchar(50)',2,N'record000001'
exec sp_executesql N'INSERT INTO "dbo"."BulkTable" ("id","txtcol") VALUES (@P1,@P2)',N'@P1 int,@P2 nvarchar(50)',3,N'record000002'
...
exec sp_executesql N'INSERT INTO "dbo"."BulkTable" ("id","txtcol") VALUES (@P1,@P2)',N'@P1 int,@P2 nvarchar(50)',1000,N'record000999'
を送ることになります
をSQL Serverに追加します。
おそらくあなたの最善の策は、私のテストネットワーク上でとても
using (var cmd = new OdbcCommand())
{
cmd.Connection = connAccess;
cmd.CommandText = "SELECT ID, TextField AS txtcol FROM Table1 WHERE ID<=1000";
using (OdbcDataReader rdr = cmd.ExecuteReader())
{
using (var sbc = new SqlBulkCopy(connStrSqlClient))
{
sbc.DestinationTableName = "BulkTable";
sbc.WriteToServer(rdr);
}
}
}
、一貫した時間の10分の1未満に仕上がっSqlBulkCopy
アプローチINSERT INTO ... SELECT
方法のように、System.Data.SqlClient
とSqlBulkCopyオブジェクトを使用することです取った。
Sql Server Integration Services .. – Max