Lock & Cursor
กระทู้เก่าบอร์ด อ.สุภาพ ไชยา

 436   9
URL.หัวข้อ / URL
Lock & Cursor

ถ้าผมต้องการเขียนโปรแกรมให้Lock Recordที่เราต้องการแก้ไขจะทำได้อย่างไร และจะเขียนให้โปรแกรม(ตัวอื่น/เครื่องอื่น)มันรู้ได้อย่างไรว่าRecordตัวนี้ถูกLockแล้วครับ แล้วLockมีกี่แบบครับ ขอบคุณมากครับ

9 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R02817
ลองดูกระทู้ http://www.thai-access.com/suphap.php?topic_id=545

หรืออ่านเพิ่มเติมใน Help ของ Access ตรงหัวข้อ RecordLocks Property ครับ

ส่วนการกำหนด RecordLocks Property สามารถเข้าไปกำหนดได้ในเมนู Tools>Options>Advanced> แล้วดูในส่วนของ Default Record Locking จะมีให้เลือก 3 แบบครับ

2 @R02924
มันเป็นแบบDAO แล้วถ้าเป็นADOมีตัวอย่างไหมครับ ขอบคุณครับ
3 @R02926
ADO ก็จะมีทั้ง 3 ตัวเหมือนกัน แต่มี Constant ต่างไป เช่น

Constant Value
adLockReadOnly 1
adLockPessimistic 2
adLockOptimistic 3
acLockBatchOptimistic 4

ตัวสุดท้ายนี้จะเหมือนกับตัวที่ 3 แต่ใช้ได้ดีกว่า และต้องเป็น SQL Server

ส่วน dbEditInProgress ใน DAO ใน ADO ก็จะมีเหมือนกันครับ เช่น

If rst.EditMode = adEditInProgress Then
If MsgBox("New Record Added", vbYesNo) = vbYes
rst.Update
Else
rst.CancelUpdate
End If

ลองศึกษาเพิ่มเติมในเอกสารของ ADO ตรงส่วน Record Locking, Record Status Property ดูนะครับ


4 @R02927
ผมนำมาจาก Help ของ Access ตรงตัวอย่างที่เขาให้มานะครับ

CursorType, LockType, and EditMode Properties Example (VB)


This example demonstrates setting the CursorType and LockType properties
before opening a Recordset. It also shows the value of the EditMode property
under various conditions. The EditModeOutput function is required for this
procedure to run.

Public Sub EditModeX()

Dim cnn1 As ADODB.Connection
Dim rstEmployees As ADODB.Recordset
Dim strCnn As String

' Open recordset with data from Employee table.
Set cnn1 = New ADODB.Connection
strCnn = "Provider=sqloledb;" & _
"Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
cnn1.Open strCnn

Set rstEmployees = New ADODB.Recordset
Set rstEmployees.ActiveConnection = cnn1
rstEmployees.CursorLocation = adUseClient
rstEmployees.CursorType = adOpenStatic
rstEmployees.LockType = adLockBatchOptimistic
rstEmployees.Open "employee", , , , adCmdTable

' Show the EditMode property under different editing
' states.
rstEmployees.AddNew
rstEmployees!emp_id = "T-T55555M"
rstEmployees!fname = "temp_fname"
rstEmployees!lname = "temp_lname"
EditModeOutput "After AddNew:", rstEmployees.EditMode
rstEmployees.UpdateBatch
EditModeOutput "After UpdateBatch:", rstEmployees.EditMode
rstEmployees!fname = "test"
EditModeOutput "After Edit:", rstEmployees.EditMode
rstEmployees.Close

' Delete new record because this is a demonstration.
cnn1.Execute "DELETE FROM employee WHERE emp_id = 'T-T55555M'"

End Sub

Public Function EditModeOutput(strTemp As String, _
intEditMode As Integer)

' Print report based on the value of the EditMode
' property.
Debug.Print strTemp
Debug.Print " EditMode = ";

Select Case intEditMode
Case adEditNone
Debug.Print "adEditNone"
Case adEditInProgress
Debug.Print "adEditInProgress"
Case adEditAdd
Debug.Print "adEditAdd"
End Select

End Function

*** Edited by Supap Chaiya *** 18/5/2546 16:07:56
5 @R02935
ผมได้ดูส่วนนี้จากHelpของVBแล้วครับแต่ไม่เข้าใจครับ ถ้าเครื่องอื่น/โปรแกรมอื่นกำลังเข้าไปแก้ไขข้อมูล เราสามารถใช้ EditMode = adEditInProgress เพื่อตรวจสอบการแก้ไขข้อมูล(เดียวกัน)โดยโปรแกรมอื่น/เครื่องอื่นได้ไหมครับ
6 @R02948
เพราะดูจากในHelpแล้วมันไม่ได้พูดถึงตรงๆแบบLockEditsของDAO และเราจำเป็นต้องไปSetค่าRecordLock PropertyในMS Accessด้วยหรือไม่ครับ ขอบคุณครับ
7 @R02950
ใน Properties ใน Options จะเป็นการกำหนดสำหรับการเปิด Query/Form ที่เรียกจากการคลิกที่ Object นั้นครับ

ส่วนการกำหนด Lock Properties ด้วยโค้ดจะเป็นการกำหนดตอนเราเริ่มเปิด Recordset นั้น

สมมติว่า ถ้าเรากำหนดใน Options ให้เป็น No Locks ถ้ามีใครเปิดตารางนั้น ไม่ว่าจะเปิดใน Query หรือ Form ก็ตาม ถ้าทำการแก้ไขอะไรค้างไว้อยู่ แล้วอีกคนเปิด Recordset ตารางนั้นเช่นกัน และจะทำการแก้ไขข้อมูลตัวเดียวกัน จะทำให้คนที่ 2 นี้ไม่สามารถจะ update ข้อมูลนั้นได้

ถ้าเราเลือก All Records ยิ่งไม่สะดวกสำหรับ Multi-Users เลยครับ คนอื่นจะไม่สามารถแก้ไขอะไรได้เลย แต่มีข้อดีคือไม่ต้องเสียเวลาไปทำอะไรอีก มันจะฟ้องตั้งแต่ตอนเปิด Table/Query/Form หรือ Recordset แล้วครับ

ส่วนถ้าเลือก Edited Record คนแรกจะมีสิทธิ์ในการแก้ไขคนเดียวถ้าเขาเริ่มทำการแก้ไข คนที่ 2 จะไม่สามารถแก้ไขอะไรได้เลย แต่ดูได้อย่างเดียว และจะไม่มี Error ขึ้นมาให้เห็นกวนใจครับ

มันมีทั้งข้อดีและข้อเสีย ต้องเลือกให้ตรงกับความต้องการของเราครับ




8 @R02984
ที่ว่า "ส่วนการกำหนด Lock Properties ด้วยโค้ดจะเป็นการกำหนดตอนเราเริ่มเปิด Recordset นั้น" ทำยังไงครับ ที่มันมี NoLocks, All Records, Edited Record ใช่ไหมครับ มันคนละตัวกับ LockType Propertyใช่ไหมครับ มีCodeให้ดูไหมครับ
9 @R02986
จากตัวอย่างข้างบนในความคิดเห็นที่ 4 จะเห็นว่ามีบันทัดหนึ่งดังนี้

rstEmployees.LockType = adLockBatchOptimistic

(ที่ใช้ adLockBatchOptimistic เพราะว่ามันเปิด Recordset ของ SQL Server ครับ)

ซึ่งเราสามารถเลือกใช้ LockType ข้างล่างได้ตามต้องการ

LockType Constant Value
adLockReadOnly 1
adLockPessimistic 2
adLockOptimistic 3
acLockBatchOptimistic 4

ลองเทียบดูครับว่ามันน่าจะจับคู่กับอันไหนใน NoLocks, All Records, Edited Record

(Pessimistic = มองโลกในแง่ร้าย , Optimistic = มองโลกในแง่ดี)


@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.1200s