在Access数据库与SQL数据库之间传输数据的最佳方法

时间:2017-03-03 13:56:39

标签: c# sql-server ms-access ado.net odbc

我最近被分配了一个构建c#windows窗体应用的任务。它需要从Access数据库中读取大量数据并传输到SQL数据库,在传输之前删除旧的SQL数据。

我之前从未做过这样的事情,并且想知道最好的方法是什么?

另外,我是否需要单独读取每个Access表并将它们保存在不同的数据集中,例如每个表的dataset1,dataset2?

非常感谢任何帮助。

由于

2 个答案:

答案 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.SqlClientSqlBulkCopy对象,就像这样

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方法所用时间的十分之一。