Как получить столбец данных в виде массива с использованием vba - из базы данных SSMS - PullRequest
0 голосов
/ 24 июня 2019

Я хочу вернуть столбец данных, который будет использоваться в качестве поля со списком в 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

1 Ответ

0 голосов
/ 24 июня 2019

Ваш If тест выключен, и GetRows не нуждается в цикле:

If Not sqlrs.EOF Then
    array1() = sqlrs.GetRows()
End If

Помните GetRows() возвращает двумерный массив с нулями, поэтому вам нужно предоставить оба измеренияпри доступе к значениям, например.

array1(0, 2)  'first field, third row
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...