Bel*_*iez 9 database sql-server vb6 ado adodb
我试图获得一些旧的VB6代码与SQL Server Compact一起使用.
我可以连接,打开数据库,一切似乎都很好.我可以运行插入选择命令.
但是,ADODB.Recordset RecordCount属性始终返回-1,即使我可以访问Fields并查看数据.更改CursorLocation = adUseClient会在执行SQL(多步操作生成错误)时导致问题.
Option Explicit
Private Const mSqlProvider As String = "Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;"
Private Const mSqlHost As String = "Data Source=C:\Database.sdf;"
Private mCmd As ADODB.Command ' For executing SQL
Private mDbConnection As ADODB.Connection
Private Sub Command1_Click()
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Dim DbConnectionString As String
DbConnectionString = mSqlProvider & _
mSqlHost
Set mDbConnection = New ADODB.Connection
mDbConnection.CursorLocation = adUseServer
Call mDbConnection.Open(DbConnectionString)
If mDbConnection.State = adStateOpen Then
Debug.Print (" Database is open")
' Initialise the command object
Set mCmd = New ADODB.Command
mCmd.ActiveConnection = mDbConnection
mCmd.CommandText = "select * from myTestTable"
mCmd.CommandType = adCmdText
Set rs = mCmd.Execute
Debug.Print rs.RecordCount ' Always returns -1 !!
Debug.Print rs.Fields(0) ' returns correct data for first row, first col
Debug.Print rs.Fields(1) ' returns correct data for first row, 2nd col
Debug.Print rs.Fields(2) ' returns correct data for first row, 3rd col
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
任何建议都会被感激地接受.
实际上,CursorLocation在这种情况下起着重要作用.使用rs.CursorLocation = adUseClient设置光标位置和尝试.
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
Dim DbConnectionString As String
DbConnectionString = mSqlProvider & _
mSqlHost
Set mDbConnection = New ADODB.Connection
mDbConnection.CursorLocation = adUseServer
Call mDbConnection.Open(DbConnectionString)
If mDbConnection.State = adStateOpen Then
Debug.Print (" Database is open")
' Initialise the command object
Set mCmd = New ADODB.Command
mCmd.ActiveConnection = mDbConnection
mCmd.CommandText = "select * from myTestTable"
mCmd.CommandType = adCmdText
Set rs = mCmd.Execute
Debug.Print rs.RecordCount ' This should now return the right value.
Debug.Print rs.Fields(0) ' returns correct data for first row, first col
Debug.Print rs.Fields(1) ' returns correct data for first row, 2nd col
Debug.Print rs.Fields(2) ' returns correct data for first row, 3rd col
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
这是由用于访问数据的游标类型造成的,本文将介绍该问题和可能的修复方法。
http://www.devx.com/tips/Tip/14143
编辑
我很抱歉没有更加关注您正在处理 Compact 的事实。对于 Compact,情况与我引用的情况类似,因为它默认使用仅向前游标(不支持行计数),但还有两种其他游标类型可用,如下面的链接中所述。
http://support.microsoft.com/kb/272067