The specific MDAC 2.1 DLL causing the problem is odbcjt32.dll.
Version 4.0.3513.00 shipped with MDAC 2.1 that was included with
SQL Server 7.0.
Version 4.0.3711.08 of odbcjt32.dll shipped with MDAC 2.1 SP1.
MDAC 2.1 SP1 has shipped with Office 2000 and is downloadable at the MDAC Web site.
The following Visual C++ code in conjunction with the Microsoft sample Northwind
database can be used to illustrate the behavior. It assumes that you used the
MFC AppWizard to generate a CRecordset-derived class that wraps the Order
Details table in nwind.mdb. The recordset must be opened as a
CRecordset::dynaset to reproduce the problem:
CDBwindSet rs;
rs.Open();
rs.m_pDatabase->BeginTrans();
rs.MoveNext();
rs.Delete();
rs.MoveNext(); //You are now on the wrong record
rs.m_pDatabase->Rollback();
rs.Close();
The following Visual Basic code in conjunction with the Microsoft sample
Northwind database can be used to illustrate the behavior. The cursor type needs
to be adOpenDynamic. ADO will degrade to a keyset cursor because the Access ODBC
driver does not support dynamic cursors.
It appears that setting the ADO recordset property CacheSize to something other
than 1 (the default) causes the bug to not appear:
Dim cnNorthwind As ADODB.Connection
Dim rsOrderDetails As ADODB.Recordset
Private Sub Form_Load()
Dim strConn As String
Dim strSQL As String
strConn = "Provider=MSDASQL;Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\temp\NWind.MDB;"
strSQL = "SELECT * FROM [Order Details] ORDER BY OrderID, ProductID"
Set cnNorthwind = New ADODB.Connection
cnNorthwind.Open strConn
cnNorthwind.BeginTrans
Set rsOrderDetails = New ADODB.Recordset
rsOrderDetails.Open strSQL, cnNorthwind, adOpenDynamic, adLockOptimistic, adCmdText
rsOrderDetails.MoveNext
MsgBox "Row 2 = " & rsOrderDetails!OrderID & " - " & rsOrderDetails!ProductID
rsOrderDetails.MoveFirst
rsOrderDetails.Delete
rsOrderDetails.MoveNext
'Note you expect to be on Row 2 as before but you are not
MsgBox "Row 2 = " & rsOrderDetails!OrderID & " - " & rsOrderDetails!ProductID
rsOrderDetails.Close
cnNorthwind.RollbackTrans
cnNorthwind.Close
End Sub