簡體   English   中英

C#將MS Access數據庫同步到SQL Server

[英]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中更改字段名稱或添加新列或刪除時,它可能會帶來問題。 最好的選擇是:

  1. 為sql server和oledb創建連接。

  2. 編寫自定義查詢以從一個連接獲取記錄並將其保存到另一個連接。

  3. 在執行之前,請確保以更新所有表定義的方式進行編程。

就我而言,這在某種程度上有所幫助,因為sql服務器上的負載下降了。

同步完成后,您是否無法將Access文件傳輸到服務器並刪除它? 您可以為此創建Windows服務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM