簡體   English   中英

將數據從一個表復制到另一個數據庫中的另一個表

[英]copy data from one table to another table in another database

我必須編寫一個程序,將數據從一個表復制到另一個數據庫中的類似表。 這部分很好,但我還有其他要求。

它必須逐行。 復制完一行后,我必須以某種方式確保/確認該行已成功復制。 之后,我需要從源數據庫的源表中刪除該行,然后進入下一行。

現在我的問題是如何確認行已成功復制? 有什么好辦法嗎?

您需要在同一事務中執行所有操作,以保證將源表中的數據復制到第二張表后,該數據始終是唯一且始終被刪除的。

為此,您可以使用TransactionScope ,如下所示:

using(var ts = New TransactionScope()){//在此處進行操作:讀取源,寫入副本,刪除目標ts.Complete(); }

請在此處查看TransactionScope文檔 並考慮以下兩件事:

  1. 您需要在項目中添加對System.Transactions程序集的引用
  2. 您需要啟動MSDTC服務(分布式事務處理協調器)。

工作原理:如果任何操作(讀取源,寫入副本,刪除源)中沒有錯誤,則tx.Complete(); 行被執行,這意味着所有操作都被確認。 如果任何操作中有任何錯誤,則在發生錯誤時,程序將在using塊之外繼續執行,因此不會調用ts.Complete() ,並且所有已完成的操作都將回滾。

通常,如果您使用任何技術(經典的SqlCommand,EF或其他任何技術)進行任何DB操作,則如果它沒有引發異常,則表示該操作正常。 因此,您可以使用try-catch-finally進行與此類似的操作,但是在某些情況下可能會失敗,例如:如果程序由於意外原因而中斷,該怎么辦? 使用TransactionScope ,將回滾掛起的操作,但是使用其他解決方案,可能不會。

首先,如果未復制該行,則用於插入該行的命令應返回錯誤。 如果沒有,則正確復制了該行。

但是,如果要確定,則在將新行插入第二個數據庫之前,請使用SELECT WHERE查詢第二個數據庫,所有列的所有值都與當前行中的值完全相同。 記住返回的行數。

然后復制新行,並再次進行相同的查詢。 現在返回的行數應該增加一。

如果行數不能相等,那么您可能希望在復制之前將返回的行數設為0,將其返回到1。

如果它是相同的數據庫,則簡單的數據庫事務將保證復制,確認,刪除集被成批執行。 在正常情況下,不需要進行SELECT COUNT檢查-如果插入失敗,則RDBMS將通過引發異常來告訴您有關信息; 但是回答您的問題-

Psudocode:

foreach(@ID in listOfIDs)
{
   BEGIN TRANSACTION
   INSERT INTO DESTINATIONTABLE SELECT * FROM SOURCETABLE WHERE ID=@ID
   DECLARE @COUNTSUCCESS INT
   SET @COUNTSUCCESS = (SELECT COUNT(1) FROM DESTINATIONTABLE WHERE ID=@ID)
   IF(@COUNTSUCESS <> 1) 
   BEGIN
      // Throw some kind of exception
      ROLLBACK TRANSACTION
   END
   DELETE FROM SOURCETABLE WHERE ID=@ID
   COMMIT TRANSACTION
}

您可以通過行計數方法進行操作。 首先創建一個Dataset實例。 它在使用System.Data中;

    DataSet ds = new DataSet();

    ds = rpt3.getShowAll();
    int x = ds.Tables[0].Rows.Count;

rpt3是我的類,其中存在getShowAll()。這里我的方法getShowAll()的過程具有要復制的完整表。
編寫復制功能的代碼。 現在再次對下一張表的行進行計數並進行比較。(請注意,再次計數時必須再次獲取

     ds = rpt3.getShowAll();

將再次使用。

暫無
暫無

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

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