Transaction มักนำมาใช้กับการอัปเดทข้อมูลหลายตารางพร้อมกัน ประโยชน์ก็คือ หากมีความผิดพลาดในระหว่างการอัปเดทตารางใดตารางหนึ่ง ก็สามารถยกเลิกการอัปเดทตารางทั้งหมดได้ ส่วนมากก็มักใช้กับการประมวลผลของเอกสารประเภท Parent-Child พูดเป็นนัยว่า ตารางข้อมูลมีความสัมพันธ์เชื่อมโยงเกี่ยวข้องกัน อย่างเช่น ใบรับของ ใบสั่งซื้อ ใบกำกับสินค้า เป็นต้น
ตัวอย่าง เพิ่มข้อมูลใน 2 ตาราง (ถ้าหากมีข้อผิดพลาดในระหว่างการอัปเดทก็ให้ยกเลิกการอัปเดททั้งหมด)
Native-SQL
LOCAL ex AS Exception
BEGIN TRANSACTION
TRY
INSERT INTO Table1 ( . . .) VALUES ( . . .)
INSERT INTO Table2 ( . . .) VALUES ( . . .)
END TRANSACTION
MESSAGEBOX("Updated completed.")
CATCH TO ex
ROLLBACK
MESSAGEBOX(STR(ex.ErrorNo)+" "+ex.Message)
ENDTRY
|
Native-DBF (Unbuffer)
LOCAL ex AS Exception
BEGIN TRANSACTION
TRY
APPEND BLANK IN Table1
REPLACE . . . WITH . . . IN Table1
APPEND BLANK IN Table2
REPLACE . . . WITH . . . IN Table2
END TRANSACTION
MESSAGEBOX("Updated completed.")
CATCH TO ex
ROLLBACK
MESSAGEBOX(STR(ex.ErrorNo)+" "+ex.Message)
ENDTRY
|
Native-DBF (Buffer)
SET MULTILOCKS ON
=CURSORSETPROP("Buffering", 5, "Table1")
=CURSORSETPROP("Buffering", 5, "Table2")
llError = .F.
BEGIN TRANSACTION
APPEND BLANK IN Table1
REPLACE . . . WITH . . . IN Table1
APPEND BLANK IN Table2
REPLACE . . . WITH . . . IN Table2
IF NOT TABLEUPDATE(1, .T., "Table1")
llError = .T.
ENDIF
IF NOT TABLEUPDATE(1, .T., "Table2")
llError = .T.
ENDIF
IF llError
ROLLBACK
MESSAGEBOX("Transaction error!")
ELSE
END TRANSACTION
MESSAGEBOX("Updated completed.")
ENDIF
|
Client/Server (SPT/Odbc)
cn = SQLSTRINGCONNECT("Driver={ . . . };Server=. . .;Database=. . .")
IF cn<=0
MESSAGEBOX("Connection error!")
RETURN
ENDIF
=SQLSETPROP(cn, 'Transactions', 2) && Manual transactions
DIMENSION laSqlcmd(2)
laSqlcmd(1) = "INSERT INTO Table1 ( . . .) VALUES ( . . .)"
laSqlcmd(2) = "INSERT INTO Table2 ( . . .) VALUES ( . . .)"
llError = .F.
FOR EACH c IN laSqlcmd
IF SQLEXEC(cn, c) <=0
llError = .T.
EXIT FOR
ENDIF
ENDFOR
IF llError
=SQLROLLBACK(cn)
MESSAGEBOX("Transaction error!")
ELSE
=SQLCOMMIT(cn)
MESSAGEBOX("Update completed.")
ENDIF
=SQLDISCONNECT(cn)
|
.NET (Odbc)
Using cn As New OdbcConnection("Driver={ . . . };Server=. . .;Database=. . .")
cn.Open()
Dim cm As OdbcCommand = cn.CreateCommand()
Dim ts As OdbcTransaction = cn.BeginTransaction()
cm.Connection = cn
cm.Transaction = ts
Dim laSqlcmd() As String = { _
"INSERT INTO Table1 ( . . .) VALUES ( . . .)", _
"INSERT INTO Table2 ( . . .) VALUES ( . . .)" _
}
Try
For Each c In laSqlcmd
cm.CommandText = c
cm.ExecuteNonQuery()
Next
ts.Commit()
MessageBox.Show("Update completed.")
Catch ex As Exception
ts.Rollback()
MessageBox.Show(ex.Message)
Finally
cn.Close()
End Try
End Using
|
ความคิดเห็น
แสดงความคิดเห็น