【问题标题】:Best method for transferring data between Access database to SQL database在 Access 数据库和 SQL 数据库之间传输数据的最佳方法
【发布时间】:2017-03-03 13:56:38
【问题描述】:

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

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

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

非常感谢任何帮助。

谢谢

【问题讨论】:

  • Sql Server 集成服务..

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


【解决方案1】:

如果您决定在您的 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 方法所用时间的十分之一内完成。

【讨论】:

    【解决方案2】:

    您可以使用名为 SQL Server Integration Services 的工具 (SSIS) 这是你的任务的工具,这是你想要使用的东西。

    或者你可以在 .net 中制作一些东西,但是使用数据集是一个糟糕的主意,因为内存、性能以及你提到的海量数据......

    或者您可以使用OPENROWSET 构造来读取 MSAccess 文件并使用 SQL 查询将数据传输到 SQL。

    可能还有其他十几种方法......

    【讨论】:

      猜你喜欢
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 2011-09-09
      • 1970-01-01
      相关资源
      最近更新 更多