C# 将MS Access数据库同步到sql server
我试图在C#中设置一个同步例程,将数据从ms access数据库发送到sql server。MS Access不是我的选择,只是它的方式 我能够查询MS Access数据库并获取OleDbDataReader记录集。我可能会读取每个记录并将其插入SQL Server,但这似乎太浪费了 有没有更好的办法。我知道我可以在MS Access中链接到sql server并轻松执行更新,但这是针对最终用户的,我不希望他们干扰Access 编辑: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
只要看看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上的负载下降了。有几种同步方法,但当您更改sql server中的字段名或添加新列或删除时,可能会出现问题。最好的选择是: