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

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

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

有一个更好的方法吗。 我知道我可以在MS Access链接到SQL Server并轻松执行更新,但这是为最终用户,我不希望他们搞乱访问。

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

您应该利用基于SET的查询function而不是RBAR工作。

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

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

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

听起来你正在做的是ETL。 有几种工具是为了实现这一目标而构建的,没有理由重新发明function。 你有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 server上的负载变低了。

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