我最近被分配了一个构建c#windows窗体应用的任务。它需要从Access数据库中读取大量数据并传输到SQL数据库,在传输之前删除旧的SQL数据。
我之前从未做过这样的事情,并且想知道最好的方法是什么?
另外,我是否需要单独读取每个Access表并将它们保存在不同的数据集中,例如每个表的dataset1,dataset2?
非常感谢任何帮助。
由于
答案 0 :(得分:0)
您可以使用名为SQL Server Integration Services的工具(SSIS) 这是您的任务工具,这是您想要使用的。
或者你可以在.net中制作一些东西,但是使用数据集是一个可怕的想法,因为内存,性能以及你提到的大量数据......
或者您可以使用OPENROWSET构造来读取MSAccess文件并使用SQL查询将数据传输到SQL。
可能还有其他几种方法......
答案 1 :(得分:0)
如果您决定在C#应用程序中实现自己的传输机制,并且您确实在处理大量数据,那么请小心选择一种不会最终将数据逐行插入SQL Server的方法。显然是像
这样的方法OdbcDataReader rdrAccess = cmdAccess.ExecuteReader();
while (rdrAccess.Read())
{
// insert a row into SQL Server
}
几乎肯定会很慢,但即使是像
这样的单一Access SQL语句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();
}
将最终发送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。
可能你最好的选择是使用System.Data.SqlClient
和SqlBulkCopy对象,就像这样
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);
}
}
}
在我的测试网络上,SqlBulkCopy
方法的完成时间不到INSERT INTO ... SELECT
方法所用时间的十分之一。