none
myCon.BeginTrans 處理問題 RRS feed

  • 問題

  • 想請問 ,若用 myCon.BeginTrans 來處理批次處理大量資料 時
    若我設 100筆 寫一次  應該是 以100比為單位 寫入
    若第126筆有誤 ,他是否也寫到 第100筆  101-125筆都會被ROLLBACK 回去
    因為我測試 時
    當第126筆 有錯誤 ,他還是在TB裡面 寫到125筆 ,
    請問 這樣對嗎

    一般 不是要等到 myCon.CommitTrans  '反應開始
    她才會 一次寫100筆進去

    101-125 會因為 126 筆錯誤而不寫入嗎

    ---------------------------------------------------


    Function update2AS400()
        
        Dim myCon As ADODB.Connection  '
        Dim myRS As ADODB.Recordset
        
        Dim xlsRow As Integer 'EXCEL 開始匯入欄位
        Set myCon = New ADODB.Connection
        
        myCon.Open "Provider=IBMDA400.DataSource.1;Password=test;Persist Security Info=True;User ID=test;Data Source=sssss"
        
        Set myRS = New ADODB.Recordset   '產生recordset
        
        'myRS.Open Source:="lib.cd", ActiveConnection:=myCon, CursorType:=adOpenDynamic, LockType:=adLockOptimistic, Options:=adCmdTable
        myRS.Open Source:="lib.cd", ActiveConnection:=myCon, CursorType:=adOpenDynamic, LockType:=adLockOptimistic, Options:=adCmdTable
        
        xlsRow = 2 'EXCEL 從第2行開始
        
       On Error GoTo Tran_err2  '攔截錯誤
        
        myCon.BeginTrans    '開始交易處裡
           With ThisWorkbook.Sheets("temp")
                Do Until xlsRow = (.UsedRange.Rows.Count + 1)
                
                    myRS.AddNew   '新增紀錄
        
                    myRS![AA] = .Cells(xlsRow, 1).Value
                    myRS![BB] = .Cells(xlsRow, 2).Value
                    myRS![CC] = .Cells(xlsRow, 3).Value
                    myRS![DD] = .Cells(xlsRow, 4).Value
                    myRS![EE] = .Cells(xlsRow, 5).Value
                    myRS![FF] = .Cells(xlsRow, 6).Value
                    myRS![GG] = .Cells(xlsRow, 7).Value
                  
                
                    myRS.Update '實際並不會寫入到DB
                
                    xlsRow = xlsRow + 1
                
                    If xlsRow Mod 100 = 3 Then
                       Debug.Print " CommitTrans------" & xlsRow
                        myCon.CommitTrans  '反應開始
                        myCon.BeginTrans   '開始進行交易處理
                
                    End If
                Loop
            End With
        myCon.CommitTrans   '寫入剩餘的變更
        myRS.Close
        
        
        Set myRS = Nothing
        myCon.Close
        Set myCon = Nothing
          
        MsgBox xlsRow - 1 & "以寫入DB"
          
        Exit Function
        
    Tran_err2:
        
        myINT = Int((xlsRow - 3) / 100) * 100
        MsgBox "第 " & xlsRow & "發生錯誤 .  目前已經寫入 " & myINT & " 記錄了 ."
        myCon.RollbackTrans  '丟棄錯誤錯誤產生之變更單位
        
        Set myCmd = Nothing
        myCon.Close
        Set myCon = Nothing
        
    End Function

    2006年7月28日 上午 01:20

解答

  • 按照正常來說,在 BeginTrans 下達以後,除非 CommitTrans 下達或是下了 RollbackTrans 指令,資料應該是不會寫入到資料庫才對 ...
    2006年7月28日 上午 03:11
    版主

所有回覆

  • 我是不建議你在同一段程式中重覆使用 BeginTrans, CommitTrans.

    建議你可以把它拆成不同的程式,例如讀取資料一支函式,寫入資料庫又是另一個函式 .

    只是我沒用過 IBM 的資料庫,不知道這個是不是 Provider 造成的 ...

    2006年7月28日 上午 02:46
    版主
  • 謝謝您

    目前  我POST 上的 就是 專門寫入的  涵式

    那想請教,正常情況下  是否為 每100比寫一次

    126行錯誤 時 101-125 不會寫入呢

    2006年7月28日 上午 02:58
  • 按照正常來說,在 BeginTrans 下達以後,除非 CommitTrans 下達或是下了 RollbackTrans 指令,資料應該是不會寫入到資料庫才對 ...
    2006年7月28日 上午 03:11
    版主