繁体   English   中英

C#将MS Access数据库同步到SQL Server

[英]C# Sync MS Access database to sql server

我正在尝试在C#中设置一个同步例程,以将数据从ms访问数据库发送到sql服务器。 MS Access不是我的选择,它只是它的方式。

我能够查询MS Access数据库并获取OleDbDataReader记录集。 我可能会读取每个单独的记录并将其插入到SQL Server中,但这似乎很浪费。

有一个更好的方法吗。 我知道我可以在链接到sql server的MS Access中做到这一点,并轻松执行更新,但这是针对最终用户的,我不希望他们弄乱Access。

编辑:只看SqlBulkCopy我认为这可能是答案,如果我将结果放入DataRow []

我在.NET中找到了一个我非常满意的解决方案。 它使我可以将同步例程的访问权限授予程序中的任何用户。 它涉及SQLBulkCopy类。

private static void BulkCopyAccessToSQLServer
        (CommandType commandType, string sql, string destinationTable)
    {
        using (DataTable dt = new DataTable())
        {
            using (OleDbConnection conn = new OleDbConnection(Settings.Default.CurriculumConnectionString))
            using (OleDbCommand cmd = new OleDbCommand(sql, conn))
            using (OleDbDataAdapter adapter = new OleDbDataAdapter(cmd))
            {
                cmd.CommandType = commandType;
                cmd.Connection.Open();
                adapter.SelectCommand.CommandTimeout = 240;
                adapter.Fill(dt);
                adapter.Dispose();
            }

            using (SqlConnection conn2 = new SqlConnection(Settings.Default.qlsdat_extensionsConnectionString))
            {
                conn2.Open();
                using (SqlBulkCopy copy = new SqlBulkCopy(conn2))
                {
                    copy.DestinationTableName = destinationTable;
                    copy.BatchSize = 1000;
                    copy.BulkCopyTimeout = 240;
                    copy.WriteToServer(dt);
                    copy.NotifyAfter = 1000;
                }
            }
        }
    }

基本上,这会将来自MS Access的数据放入数据表中,然后使用第二个连接conn2和SqlBulkCopy类将数据从该数据表发送到SQL Server。 它可能不是最好的代码,但是应该让任何人读懂这个想法。

您应该利用基于SET的查询的力量胜过RBAR。

查看SSIS解决方案以同步数据,然后使用SQL Server代理安排程序包定期运行。

您可以从命令行调用SSIS程序包,以便可以从MS Access或C#有效地进行操作。

同样,SQL Server,MS Access DB和SSIS包不必位于同一台计算机上。 只要您的调用程序可以看到SSIS包,并且该包可以连接到SQL Server和MS Access DB,您就可以将数据从一个位置传输到另一个位置。

听起来您正在做的是ETL。 有很多工具可以做到这一点,对我而言,没有什么理由重新发明该功能。 您有SQL Server,因此您有SSIS。 它具有大量用于自动转换,清理,查找等的工具,您可以直接使用它们。

除非这是真正的临时数据加载,并且绝对没有增加上传复杂性的空间,否则以后再增加(是的,对!),我将使用经过验证的ETL工具。

如果没有选择SQL Server Integration Services,则可以将您从Access中读取的数据写到一个临时文本文件中,然后调用bcp.exe将其加载到数据库中。

我以前做过这样的事情。

我用了

OleDbConnection aConnection = new OleDbConnection(String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}", fileName));
            aConnection.Open();

打开访问数据库。 然后

OleDbCommand aCommand = new OleDbCommand(String.Format("select * from {0}", accessTable), aConnection);
                    OleDbDataReader aReader = aCommand.ExecuteReader();

执行从表中的读取。 然后

int fieldCount = aReader.FieldCount;

得到现场计数

while (aReader.Read())

循环记录并

object[] values = new object[fieldCount];
                        aReader.GetValues(values);

检索值。

有几种同步方法,但是当您在sql server中更改字段名称或添加新列或删除时,它可能会带来问题。 最好的选择是:

  1. 为sql server和oledb创建连接。

  2. 编写自定义查询以从一个连接获取记录并将其保存到另一个连接。

  3. 在执行之前,请确保以更新所有表定义的方式进行编程。

就我而言,这在某种程度上有所帮助,因为sql服务器上的负载下降了。

同步完成后,您是否无法将Access文件传输到服务器并删除它? 您可以为此创建Windows服务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM