KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q244801: PRB: Run-time Bound ADO Recordset Skips Second Record

Article: Q244801
Product(s): Microsoft Visual Basic for Windows
Version(s): 2.0,2.01,2.1,2.1 SP1,2.1 SP2,2.5,2.6,6.0
Operating System(s): 
Keyword(s): kbADO200 kbADO201 kbADO210 kbDataBinding kbVBp600 kbDataEnv kbGrpDSVBDB kbGrpDSMDAC kbD
Last Modified: 23-AUG-2001

-------------------------------------------------------------------------------
The information in this article applies to:

- Microsoft Visual Basic Professional Edition for Windows, version 6.0 
- Microsoft Visual Basic Enterprise Edition for Windows, version 6.0 
- ActiveX Data Objects (ADO), versions 2.0, 2.01, 2.1, 2.1 SP1, 2.1 SP2, 2.5, 2.6, 2.7 
-------------------------------------------------------------------------------

SYMPTOMS
========

When using a recordset with a server-side forward-only, or dynamic cursor and
binding to a textbox at run-time it is possible for the recordset to skip the
second record. The textbox will initially display the first record. A MoveNext
causes it to display the third record. With the dynamic cursor, a MovePrevious
will then display the second record correctly. This behavior is only exhibited
immediately after binding or after a ReQuery. This behavior is also shown if the
textbox is bound from the Data Environment.

RESOLUTION
==========

The recordset can be displayed correctly by reading one of the fields prior to
binding to the text box. For a run-time bound control, use the following code
prior to binding the textbox.

  Dim strTemp as String
  strTemp = rs(0)         'rs is the Recordset

When using the Data Environment, the only way around this problem is to bind the
textbox at run-time and use the workaround earlier. When you want to call the
ReQuery method, you should re-bind the recordset. The following code shows the
workaround with ReQuery.

  rs.ReQuery
  Dim strTemp as String
  strTemp = rs(0)
  Set Text1.DataSource = rs

MORE INFORMATION
================

Steps to Reproduce Behavior
---------------------------

1. Create a New .exe Project.

2. Add the Microsoft ActiveX Data Objects 2.x Library to your project.

3. Add a Textbox (Text1) and two Buttons (Command1 and Command2) to your form.

4. Add the following code to your project.

  Option Explicit

  Dim rs As Recordset

  Private Sub Command1_Click()
     With rs
        .MoveNext
        If .EOF Then
           .MoveLast
        End If
     End With
  End Sub

  Private Sub Command2_Click()
     With rs
        .MovePrevious
        If .BOF Then
           .MoveFirst
        End If
     End With
  End Sub

  Private Sub Form_Load()
     Dim cn As Connection
     Set cn = New Connection
     cn.CursorLocation = adUseServer
     cn.Open "DSN=Northwind"
     
     Set rs = New Recordset
     Set rs.ActiveConnection = cn
     rs.CursorType = adOpenDynamic
     rs.Open "SELECT EmployeeID FROM Employees ORDER BY EmployeeID"
     
     'Uncomment the next two lines to fix problem
     'Dim strTemp As String
     'strTemp = rs("EmployeeID")
     
     Set Text1.DataSource = rs
     Text1.DataField = "EmployeeID"
     
     Command1.Caption = "Next"
     Command2.Caption = "Previous"
  End Sub

5. Run the Project. The textbox displays the first record.

6. Click Next. The textbox will now show the third record.

Additional query words:

======================================================================
Keywords          : kbADO200 kbADO201 kbADO210 kbDataBinding kbVBp600 kbDataEnv kbGrpDSVBDB kbGrpDSMDAC kbDSupport kbADO210sp2 kbMDAC250 kbADO250 kbMDAC260 kbADO260 kbATM kbmdac270 kbado270 
Technology        : kbVBSearch kbAudDeveloper kbADOsearch kbADO210 kbADO201 kbADO200 kbADO210sp1 kbADO210sp2 kbADO250 kbADO260 kbZNotKeyword6 kbZNotKeyword2 kbVB600Search kbVB600 kbADO270
Version           : :2.0,2.01,2.1,2.1 SP1,2.1 SP2,2.5,2.6,6.0
Issue type        : kbprb

=============================================================================

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.