Я хочу вернуть столбец данных, который будет использоваться в качестве поля со списком в Excel.Для этого я использую набор записей, чтобы вернуть мои данные из хранимой процедуры.У меня проблема в том, что я не могу понять, как заполнять или даже отображать информацию, которую я возвращаю - или даже если я возвращаю все данные.
Я знаю, что есть решения в Интернете, которые рекомендуют использовать"rs.GetRows" для заполнения массива, однако мне не повезло с этим.Первоначально я намеревался заполнить массив путем индексации записей в наборе записей и добавления их по отдельности.Проблема в том, что я никогда не могу получить размер набора записей, и, поскольку я использую динамический SQL, размер моего массива никогда не бывает одинаковым.Я занимался этим некоторое время, и мне было интересно, есть ли хороший способ сделать это.
Код VBA
Public Sub SQL_SP_Column_Data2(ByVal sql_col As String, _
ByVal sql_table As String)
On Error GoTo RunTimeError
Dim array1() As Variant
Dim sqlconxn As ADODB.connection
Dim sqlcmd As ADODB.Command ' Operates as a command between SQL and vba
Dim sqlrs As ADODB.recordSet
Dim conxnString As String
Application.ScreenUpdating = False
' String used to establish a connection to the database
conxnString = "driver={SQL Server};" & _
"server='server_name';" & _
"uid='username';" & _
"pwd='password';" & _
"database='database_name';"
Set sqlconxn = New ADODB.connection
Set sqlcmd = New ADODB.Command
Set sqlrs = New ADODB.recordSet
sqlconxn.ConnectionTimeout = 30
sqlconxn.Open conxnString ' makes the connection between SQL
MsgBox "Connection 1 state: " & GetState2(sqlconxn.state)
sqlcmd.CommandType = adCmdStoredProc ' sets command to a stored procedure
sqlcmd.CommandText = "GET_COLUMN_DATA" ' name of the stored procedure
sqlcmd.ActiveConnection = sqlconxn ' makes the sql connection
sqlcmd.Parameters.Append _
sqlcmd.CreateParameter("@column_name", adVarChar, adParamInput, 255, sql_col)
sqlcmd.Parameters.Append _
sqlcmd.CreateParameter("@data_table_name", adVarChar, adParamInput, 255, sql_table)
sqlrs.Open sqlcmd
If sqlrs.EOF Then
array1() = sqlrs.GetRows
Debug.Print "VALUES: " + array1(i)
sqlrs.MoveNext
i = i + 1
End If
RunTimeError: ' Reportd any errors that might occur in the system and
Dim strError As String
strError = "ERROR: " & Err.Number & vbCrLf & Err.Description
MsgBox strError
Debug.Print strError
Exit Sub
End Sub
Я использую GetRows вышепотому что это был самый рекомендуемый метод, но я не могу заставить его работать так, как я намереваюсь.В этом примере я обычно получаю ОШИБКУ: 0 или индекс вне диапазона.
Хранимая процедура SQL
USE AFCD
GO
ALTER PROCEDURE dbo.GET_COLUMN_DATA (@column_name nvarchar(max),
@data_table_name nvarchar(max)) AS
BEGIN
DECLARE @query nvarchar(max)
SET @query = 'SELECT ' + @column_name +
' FROM ' + @data_table_name + ''
EXEC sp_executesql @query
END
Когда я тестирую эту хранимую процедуру, я фактически получаю данныея хочу знать, что моя хранимая процедура возвращает то, что я хочу, но я не знаю, как получить это в vba.
Пример ожидаемых выходных данных: Если входные данные в подпрограмме vba - - "WIRE_TYPE "," WIRE_INDEX "
SQL_SP_Column_Data2 "WIRE_TYPE", "WIRE_INDEX"
Тогда вывод должен выглядеть следующим образом:
Stainless Steel
Steel ER70S-3
Steel ER70S-6
Titanium(1)
Titanium(2)
SOLUTION - эта часть кода относится к моему vba и являетсясразу после того, как я выполню свой SQL SP.Благодарим Тима Уильямса за ответ.
If Not sqlrs.EOF Then
array1() = sqlrs.GetRows()
End If
Dim i As Integer
For i = 0 To 4
Debug.Print "VALUES: " + array1(0, i) ' 2D array!!!
Next i