C#将MS Access数据库同步到sql server

时间:2009-11-20 14:13:08

标签: c# sql-server ms-access

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

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

有没有更好的方法来做到这一点。我知道我可以在MS Access链接到sql server并轻松执行更新,但这适用于最终用户,我不希望他们搞乱访问。

修改 只是看看SqlBulkCopy,我认为如果我将结果导入DataRow []

,这可能就是答案。

6 个答案:

答案 0 :(得分:7)

我在.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的数据放入DataTable,然后使用第二个连接conn2和SqlBulkCopy类将数据从此DataTable发送到SQL Server。它可能不是最好的代码,但应该让任何读这个想法的人。

答案 1 :(得分:1)

您应该利用基于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工具。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我之前做过类似的事。

我用过

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);

检索值。

答案 4 :(得分:0)

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

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

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

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

  4. 在我的情况下,这在某种程度上有所帮助,因为sql server上的负载已经关闭。

答案 5 :(得分:-1)

您是否可以将Access文件传输到服务器并在同步完成后将其删除? 您可以为此创建Windows服务..