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

C# 将MS Access数据库同步到sql server,c#,sql-server,ms-access,C#,Sql Server,Ms Access,我试图在C#中设置一个同步例程,将数据从ms access数据库发送到sql server。MS Access不是我的选择,只是它的方式 我能够查询MS Access数据库并获取OleDbDataReader记录集。我可能会读取每个记录并将其插入SQL Server,但这似乎太浪费了 有没有更好的办法。我知道我可以在MS Access中链接到sql server并轻松执行更新,但这是针对最终用户的,我不希望他们干扰Access 编辑: 只要看看SqlBulkCopy,我想如果我将结果放入Data

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

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

有没有更好的办法。我知道我可以在MS Access中链接到sql server并轻松执行更新,但这是针对最终用户的,我不希望他们干扰Access

编辑:
只要看看SqlBulkCopy,我想如果我将结果放入DataRow[]

中,这可能就是答案。您应该利用基于集合的查询的能力,而不是RBAR

研究SSIS解决方案以同步数据,然后使用SQL Server代理计划包定期运行

您可以从命令行调用SSIS包,以便可以从MS Access或C#有效地执行此操作

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

听起来你正在做的是ETL。有几个工具就是为了实现这一点而构建的,对我来说,没有什么理由重新设计功能。您有SQL Server,因此您有SSI。它有大量用于自动转换、清理、查找等的工具,您可以开箱即用


除非这是一个真正的干净利落的数据负载,而且以后上传的复杂性绝对没有增加的余地(是的,没错!),否则我会使用一个经过尝试和测试的ETL工具。

你应该利用基于集合的查询的能力,而不是RBAR

研究SSIS解决方案以同步数据,然后使用SQL Server代理计划包定期运行

您可以从命令行调用SSIS包,以便可以从MS Access或C#有效地执行此操作

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

听起来你正在做的是ETL。有几个工具就是为了实现这一点而构建的,对我来说,没有什么理由重新设计功能。您有SQL Server,因此您有SSI。它有大量用于自动转换、清理、查找等的工具,您可以开箱即用


除非这是一个真正的干净利落的数据负载,而且以后上传的复杂性绝对没有增加的余地(是的,没错!),否则我会使用一个经过测试的ETL工具。

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

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

我以前做过类似的操作

我曾经

OleDbConnection aConnection = new OleDbConnection(String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}", fileName));
            aConnection.Open();
打开access数据库。然后

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

检索值。

我以前做过类似的操作

我曾经

OleDbConnection aConnection = new OleDbConnection(String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}", fileName));
            aConnection.Open();
打开access数据库。然后

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

检索值。

同步完成后,您能否将Access文件传输到服务器并将其删除?
您可以为此创建windows服务。

同步完成后,您不能将Access文件传输到服务器并删除它吗?
您可以为此创建windows服务。

我在.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。这可能不是最好的代码,但应该能让阅读本文的人了解它。

我在.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。这可能不是最好的代码,但应该能让阅读本文的人了解它。

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

  • 为sql server和oledb创建连接

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

  • 在执行之前,请确保以更新所有表定义的方式编写程序


  • 在我的例子中,这在某种程度上有所帮助,因为sql server上的负载下降了。

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

  • 为sql server和oledb创建连接

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

  • 在执行之前,请确保以更新所有表定义的方式编写程序

  • 在我的例子中,这在某种程度上有所帮助,因为sql server上的负载降低了。

    考虑过这一点,但是