调整了.cursertype的VBA“行集不支持向后提取”错误

Use*_*716 1 excel vba excel-vba

使用以下代码打开与SQL Server的连接,并将结果直接放入数组中。我的问题是,行计数出错,需要重新格式化数组。我得到的错误在下面指示的行上并显示为

“行不支持向后获取”

我能找到的所有答案都建议将游标类型作为问题,但是据我所知,我已经对此进行了更改。对于冗长的代码表示歉意,我觉得最好还是从头开始。

Function ConnectServer() As String()
'Working SQL Server connection

Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sConnString As String
Dim strSqlQuery As String
Dim iCols As Long


' Create the connection string.
sConnString = "Provider=SQLOLEDB;Data Source=wait;" & _
              "Initial Catalog=what;" & _
              "User Id=foo;" & _
              "Password=bar;"

' Create the Connection and Recordset objects.
Set conn = New ADODB.Connection
Set rs = New ADODB.Recordset
rs.CursorType = adOpenDynamic
rs.CursorLocation = adUseClient
conn.CommandTimeout = 50

' Open the connection and execute.
conn.Open sConnString

'    Debug.Print strSqlQuery
Set rs = conn.Execute("SELECT DISTINCT a FROM b")

' Check we have data.
If Not rs.EOF Then
'*****************Problem here********************
    rs.MoveLast
    Debug.Print rs.RecordCount

'Read into array and cleanup...
End If

End Function
Run Code Online (Sandbox Code Playgroud)

我不认为这是这个问题的重复:

行集不支持向后滚动

因为我已经将答案合并到我的代码中,但问题仍然存在。

小智 5

该问题是由使用conn.Execute填充记录集引起的。设置记录集到ADODB.Connection的activeconnection并使用记录集的open方法将解决此问题。

Function ConnectServer() As String()
   'Working SQL Server connection

    Dim conn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim sConnString As String
    Dim strSqlQuery As String
    Dim iCols As Long

    ' Create the connection string.
    sConnString = "Provider=SQLOLEDB;Data Source=wait;" & _
                  "Initial Catalog=what;" & _
                  "User Id=foo;" & _
                  "Password=bar;"

    ' Create the Connection and Recordset objects.
    Set conn = New ADODB.Connection
    conn.ConnectionString = sConnString
    conn.Open

    Set rs = New ADODB.Recordset

    With rs
        .ActiveConnection = conn
        .CursorType = adOpenDynamic
        .LockType = adLockOptimistic
        .Source = "SELECT * FROM b"
        .Open
    End With

    ' Check we have data.
    If Not rs.EOF Then

        rs.MoveLast
        Debug.Print rs.RecordCount

        'Read into array and cleanup...
    End If

End Function
Run Code Online (Sandbox Code Playgroud)

您可以使用Recordset.GetRows()填充数组。无需调暗它。GetRows方法(ADO)