異なるマシンで2台のSQL2008サーバーを使用しています。サーバー名は、、source.ex.com
およびdestination.ex.com
です。
destination.ex.com
にリンクされており、呼び出され たデータベースに書き込むsource.ex.com
ための適切な権限が設定されています。source.ex.com
bacon-wrench
destination.ex.com
source.ex.com
SMS経由でログインし、このクエリをテストしました(正常に):
INSERT INTO [destination.ex.com].[bacon-wrench].[dbo].[tblFruitPunch]
(PunchID, BaconID) VALUES (4,6);
C#.NET 4.0 Webページで、接続しsource.ex.com
て同様のクエリを実行します(成功しました)。
using(SqlConnection c = new SqlConnection(ConfigurationManager.ConnectionStrings["SOURCE"].ConnectionString))
{
c.Open();
String sql = @"
INSERT INTO [destination.ex.com].[bacon-wrench].[dbo].[tblFruitPunch]
(PunchID, BaconID) VALUES (34,56);";
using(SqlCommand cmd = new SqlCommand(sql, c))
{
cmd.ExecuteNonQuery();
}
}
挿入ステートメントの小さなセット(たとえば20以下)の場合、次のように実行すると問題なく実行されます。
using(SqlConnection c = new SqlConnection(ConfigurationManager.ConnectionStrings["SOURCE"].ConnectionString))
{
c.Open();
String sql = @"
INSERT INTO [destination.ex.com].[bacon-wrench].[dbo].[tblFruitPunch]
(PunchID, BaconID) VALUES (34,56);
INSERT INTO [destination.ex.com].[bacon-wrench].[dbo].[tblFruitPunch]
(PunchID, BaconID) VALUES (22,11);
INSERT INTO [destination.ex.com].[bacon-wrench].[dbo].[tblFruitPunch]
(PunchID, BaconID) VALUES (33,55);
INSERT INTO [destination.ex.com].[bacon-wrench].[dbo].[tblFruitPunch]
(PunchID, BaconID) VALUES (1,2);";
using(SqlCommand cmd = new SqlCommand(sql, c))
{
cmd.ExecuteNonQuery();
}
}
私は約20000レコードでこのようなことをしようとしています。上記の方法は、完了するのに11分かかります。これは、サーバーが何らかの一括操作を行うために私を攻撃していると思います。他のStackOverflowスレッドから、このSqlBulkCopy
クラスが推奨され、パラメーターDataTable
として完璧です。
そこで、DataTableを作成し、サーバーに書き込もうとしました(失敗)。
DataTable dt = new DataTable();
dt.Columns.Add("PunchID", typeof(int));
dt.Columns.Add("BaconID", typeof(int));
for(int i = 0; i < 20000; i++)
{
//I realize this would make 20000 duplicate
//rows but its not important
dt.Rows.Add(new object[] {
11, 33
});
}
using(SqlConnection c = new SqlConnection(ConfigurationManager.ConnectionStrings["SOURCE"].ConnectionString))
{
c.Open();
using(SqlBulkCopy bulk = new SqlBulkCopy(c))
{
bulk.DestinationTableName = "[destination.ex.com].[bacon-wrench].[dbo].[tblFruitPunch]";
bulk.ColumnMappings.Add("PunchID", "PunchID");
bulk.ColumnMappings.Add("BaconID", "BaconID");
bulk.WriteToServer(dt);
}
}
EDIT2:以下のメッセージは私が修正しようとしているものです:
Webページがクラッシュしbulk.WriteToServer(dt);
てエラーメッセージが表示されますDatabase bacon-wrench does not exist please ensure it is typed correctly.
何が間違っていますか?これを変更して機能させるにはどうすればよいですか?
編集1:
以下の構文を使用して、クエリを大幅に高速化することができました。しかし、そのような小さなレコードセットではまだ非常に遅いです。
using(SqlConnection c = new SqlConnection(ConfigurationManager.ConnectionStrings["SOURCE"].ConnectionString))
{
c.Open();
String sql = @"
INSERT INTO [destination.ex.com].[bacon-wrench].[dbo].[tblFruitPunch]
(PunchID, BaconID) VALUES
(34,56),
(22,11),
(33,55),
(1,2);";
using(SqlCommand cmd = new SqlCommand(sql, c))
{
cmd.ExecuteNonQuery();
}
}