The information in this article applies to:
- Microsoft Visual Basic Enterprise Edition for Windows, version 5.0
SYMPTOMS
"MOVE 0" fails to refresh the contents of a record with the current
contents of the database after an UPDATE fails.
CAUSE
A client-side cursor is being used.
RESOLUTION
Make sure cursordriver is set to rdUseServer or rdUseIfNeeded. Some
databases do not support server-side cursors.
STATUS
This behavior is by design.
MORE INFORMATION
The "MOVE 0" command is used to refresh a record to the current contents of
the database after a failed update. The UPDATE failed because the contents
of the record changed since the time it was originally retrieved for
editing. The cursor must be a server-side cursor for MOVE 0 to work
correctly. If the cursor is a client-side cursor, MOVE 0 will not refresh
the contents of the record with the current contents of the database.
Steps to Reproduce Behavior
- In SQL Server Enterprise Manager, add two new fields to the Pub_Info
table in the Pubs database:
a. Open the Enterprise Manager and find the Pub_Info table in the Pubs
database.
b. Right-click the Pub_Info table and click Edit.
c. Add two new fields to this table. Name one field Pub_Name and make it
char(10) (allow NULL values). Name the second field WhatTime and make
it a timestamp field (also allow NULL values).
d. On the ISQL command window, issue the following query to initialize
these new fields:
UPDATE Pub_Info SET Pub_Name = 'Name'
- Start Visual Basic and create a new Standard EXE project. On the
Project menu, click References, and then check "Microsoft Remote Data
Object 2.0."
- Place four command buttons on the form and paste the following code in
the form code window. Change dsName:=mymachine (below) to a datasource
name on your machine.
Option Explicit
Dim en As rdoEnvironment
Dim rs As rdoResultset
Dim cn As rdoConnection
Dim sqlstr As String
Private Sub Command1_Click()
sqlstr = "select * from pub_info"
Set rs = cn.OpenResultset(sqlstr, rdOpenKeyset, _
rdConcurRowVer)
Debug.Print rs(3)
End Sub
Private Sub Command2_Click()
rs.Edit
rs(3) = "McMillan"
Debug.Print rs(3) & " after edit"
End Sub
Private Sub Command3_Click()
On Error GoTo errhand
rs.Update
Exit Sub
errhand:
MsgBox Err.Number
rs.Move 0
Debug.Print rs(3) & " after move 0"
End Sub
Private Sub Command4_Click()
If Not (rs Is Nothing) Then
rs.Close
End If
cn.Close
Unload Me
End Sub
Private Sub Form_Load()
Set en = rdoEnvironments(0)
en.CursorDriver = rdUseClientbatch
Set cn = en.OpenConnection(dsName:="mymachine", _
Prompt:=rdDriverNoPrompt, _
Connect:="uid=sa;pwd=;database=PUBS;")
Command1.Caption = "resultset"
Command2.Caption = "edit "
Command3.Caption = "update"
Command4.Caption = "quit"
End Sub
- Make two copies of this project. In the second copy, change the
following line of code from
rs(3)="McMillan"
to the following:
rs(3)= "Schuster"
Run one of the projects. Click Resultset and then click Edit.
- Run the second copy of this project and click Resultset, click Edit and
then click Update. Return to the first instance of the project and click
Update. The 40002 error is trapped and the MOVE 0 command is executed.
NOTE: The immediate window does not show the current value in the
database. The value reverts to what the original query retrieved.
- Change rdUseClientBatch to rdUseServer or rdUseIfNeeded. The value
displayed in the debug window after the UPDATE error now shows the value
currently in the database. MOVE 0 does not refresh the record to the
current value if cursordriver is set to rdUseodbc or rdUseClientBatch.
REFERENCES
In Visual Basic Books Online see the following:
Guide to Building Client Server Applications in Visual Basic
(Enterprise); Choosing an RDO Cursor Type
For additional information, please see the following article in the
Microsoft Knowledge Base:
ARTICLE-ID: Q168162
TITLE : FIX: RDO Move 0 Fails to Refresh Record