2009-11-20 106 views
1

我想在C#中設置一個同步例程將數據從一個MS訪問數據庫發送到一個SQL服務器。 MS Access不是我的選擇,它只是它的方式。C#同步MS Access數據庫到SQL服務器

我能夠查詢MS Access數據庫並獲取OleDbDataReader記錄集。我可能會讀取每個單獨的記錄並將其插入SQL Server,但看起來很浪費。

有沒有更好的方法來做到這一點。我知道我可以在MS Access中鏈接到sql server並執行更新,但這是爲了最終用戶,我不希望他們搞亂訪問。

編輯: 只看SqlBulkCopy的我認爲這可能是答案,如果我讓我的成績進入的DataRow []

回答

7

我發現了一個.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類從該數據表到SQL Server發送數據。這可能不是最好的代碼,但應該給任何讀這個想法的人。

+0

這是一個恥辱,有0 upvotes,因爲這是完美的。我只需要更改連接字符串以使用2010年的Access數據庫accdb文件的ACE 12格式和一切工作。謝謝! – chrismay 2011-09-18 15:11:55

1

你應該利用在RBAR努力SET基於查詢的力量。

查看SSIS解決方案以同步數據,然後使用SQL Server代理程序定期運行包以定期運行。

你可以從命令行調用一個SSIS包,這樣你就可以有效地從MS Access或C#中執行它。

此外,SQL Server,MS Access數據庫和SSIS包不必位於同一臺計算機上。只要您的調用程序可以看到SSIS包,並且該包可以連接到SQL Server和MS Access DB,則可以將數據從一個地方傳輸到另一個地方。

這聽起來像你在做什麼是ETL。有幾種工具可以完成這一工作,對我來說,沒有什麼理由重新發明功能。你有SQL Server,因此你有SSIS。它有很多工具可用於自動轉換,清理,查找等,您可以直接使用這些工具。

除非這是一個真正的剪切乾燥數據加載,並且上傳的複雜度絕對沒有餘地增加(是的,正確!),我會使用經過驗證和測試的ETL工具。

+0

想到了這一點,但我需要它作爲和當時的操作不是預定的。此外,SQL Server的需要SQL服務器和MS訪問數據庫與我記得在同一臺服務器上。 – PeteT 2009-11-20 14:35:33

+0

回答編輯意見 – 2009-11-20 14:52:42

0

如果SQL Server Integration Services不是一個選項,您可以將臨時文本文件寫出您從Access讀取的數據,然後調用bcp.exe將其加載到數據庫。

0

我以前做過這樣的事情。

我用

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

檢索值。

+0

我沒有問題獲取數據。我可以將它讀入數據讀取器或數據表,只是不知道如何從每個記錄插入到SQL Server。 – PeteT 2009-11-20 14:37:39

+0

你可以做的是建立一個「;」定界插入語句的字符串。你可以決定一個好的數字,比如說10,100或1000.循環記錄直到達到這個限制,然後執行一條語句來執行一個多重插入。這將減少數據庫執行的次數。 – 2009-11-20 14:46:52

+0

是一個好主意,仍然希望有人有我明顯錯過,使其簡單。 – PeteT 2009-11-20 14:48:48

-1

在同步完成後,您不能將Access文件傳輸到服務器並將其刪除嗎? 你可以創建Windows服務..

0

有幾種方法可以同步,但是當您在sql server中更改字段名稱或添加新列或刪除時,可能會出現問題。最好的選擇是:

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

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

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

在我的情況下,這種方式有所幫助,因爲sql server上的負載降低了。