2008-10-24 122 views
3

像往常一樣,一些背景信息優先:如何使用DataSet將數據從一個數據庫傳輸到另一個數據庫?

數據庫A(Access數據庫) - 持有一個表,只有我需要從兩列的信息。來自這兩列的信息對於那些不能訪問數據庫A的用戶將使用的應用程序是必需的。

數據庫B(Access數據庫) - 包含僅包含兩列的表(表中列出了我們需要的鏡像一個)。數據庫B可供應用程序的所有用戶訪問。一個問題是,列名稱與數據庫A中的表名不一樣。

我需要做的是通過一個將自動運行的實用程序傳輸必要的數據,例如每週一次(兩個數據庫不需要完全同步,只需關閉即可)。轉移實用程序將從可以訪問這兩個數據庫的用戶帳戶運行(顯然)。

下面是我採取了(如果再有一個更好的辦法,請建議的距離)的方法:

  1. 抓住從數據庫A的數據只有在必要的表中的兩列。

  2. 使用DataReader對象和WriterStream對象將數據寫出到[tablename] .txt文件。我已經這樣做了,因此我可以使用schema.ini文件並強制數據列與數據庫B中的數據列具有相同的名稱。

  3. 創建一個DataSet對象,其中包含一個DataTable,用於將表數據庫B.

  4. 使用具有文本擴展屬性hdr = yes和fmt =分隔符的Microsoft.Jet.OLEDB.4.0提供程序將.txt文件中的信息吸收到DataTable中(以匹配具有模式的方式.ini文件設置和.txt文件設置)。我正在使用DataAdapter填充DataTable。

  5. 創建另一個數據集對象,含有一個反映從數據庫B.

  6. 吸在從數據庫B中的信息的表,以便它包含了所有在需要被更新的表中找到的當前數據的DataTable從數據庫A.再次,我使用DataAdapter來填充此DataTable(從步驟5,因爲他們都使用不同的數據源不同的一個)。

  7. 合併包含來自數據庫A(或.txt文件,技術上)的數據的DataTable。

  8. 更新數據庫B的表中的變化。

我已經寫了更新,刪除和手動INSERT命令因爲這是repsonsible的交談數據庫B.然而DataAdapter的,這個邏輯是從未使用過,因爲數據集 - 從 - 數據庫 - B.Merge(數據集-From-TxtFile [tableName])不會翻轉HasChanges標誌。這意味着DataSet-From-Database-B.Update不會觸發任何命令。

那麼有沒有什麼辦法可以從DataSet-From-TxtFile中獲取數據來合併並使用我正在使用的方法應用到數據庫B?我錯過了關鍵的一步嗎?

我知道我總是可以從數據庫B的表中刪除所有記錄,然後插入文本文件中的所有記錄(即使我必須遍歷DataSet中的每條記錄並應用row.SetAdded以確保觸發器HasChanges標誌),但我寧願它只應用每次更改。我正在使用c#和2.0框架(我意識到我意味着我可以使用DataTables和TableAdapters而不是DataSets和DataAdapters,因爲我只處理單個表,但無論如何)。

TIA

回答

3

的,我會使用SQLServer的,只有有多個視圖控制誰可以看到,以避免它什麼樣的信息在整個單個表片刻撇開同步問題...

我認爲@Mitchel在這裏是正確的。只需編寫一個連接到兩個數據庫的程序,分別加載一個表和B表。然後,對於A中的每個元素(列對)確保它在B中。如果不是,則將其插入B.然後,對於B中的每個元素,確保它在A中。如果不是,則將其從B中移除。保存B.我沒有看到首先需要去文件。

僞代碼:

DataTable A = load table from A 
DataTable B = load table from B 

foreach row in A 
    col1 = row[col1] 
    col2 = row[col2] 
    matchRow = B.select("col1 = " + col1 + " and col2 = " + col2) 
    if not matchRow exists 
     add new row to B with col1,col2 
    end 
end 

foreach row in B 
    col1 = row[col1] 
    col2 = row[col2] 
    matchRow = A.select("col1 = " + col1 + " and col2 = " + col2) 
    if not matchRow exists 
     remove row from B 
    end 
end 

update B 
+0

該文件是因爲兩個數據庫中的列名不同,所以我不確定DataAdapter會如何反應。通過使用該文件,我可以將數據強制轉換爲具有匹配列名的DataSet(通過使用schema.ini文件並在文本文件中寫出列標題)。 – 2008-10-24 17:13:13

0

爲什麼不能簡單地用數據讀取器,以及遍歷記錄,上工插入如果需要到數據庫B?

,而不是數據集時,合併等。

+0

我已考慮過這一點,但我記得嘗試過類似的東西,它似乎要慢得多。另外,可能某些記錄可能會從數據庫A中刪除,所以需要在數據庫B中刪除它們。甚至不確定合併是否也可以處理該記錄。 – 2008-10-24 16:15:33

相關問題