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

时间:2016-07-27 10:14:43

标签: vba excel-vba excel

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

  

“rowset不支持向后提取”

我能找到的所有答案都建议将光标类型作为问题,但据我所知,我已经改变了这一点。为长代码道歉,我觉得最好离开开始。

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

我不相信这是这个问题的重复:

Rowset does not support scrolling backward

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

1 个答案:

答案 0 :(得分:4)

问题是由使用conn.Execute填充记录集引起的。将记录集的activeconnection设置为ADODB.Connection并使用记录集的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

您可以使用Recordset.GetRows()填充数组。不需要暗淡它。 GetRows Method (ADO)