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)