[英]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中更改字段名稱或添加新列或刪除時,它可能會帶來問題。 最好的選擇是:
為sql server和oledb創建連接。
編寫自定義查詢以從一個連接獲取記錄並將其保存到另一個連接。
在執行之前,請確保以更新所有表定義的方式進行編程。
就我而言,這在某種程度上有所幫助,因為sql服務器上的負載下降了。
同步完成后,您是否無法將Access文件傳輸到服務器並刪除它? 您可以為此創建Windows服務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.