คำสั่ง Transaction ใน Visual Foxpro

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

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

หลายหลายวิธีแสดงข้อมูลด้วย Grid

ทำไมรันโปรแกรม EXE แล้วหายแว๊บ !

FAQ: Visual Foxpro Runtime Error