簡體   English   中英

Excel VBA - 存儲過程(SQL Server)

[英]Excel VBA - Stored Procedure (SQL Server)

我有一個小問題,檢索多個記錄集(帶有列名)並將數據粘貼到Excel工作表中,如下圖所示

在此輸入圖像描述

我剛剛檢索到第一個記錄集而不是其余記錄集的VBA代碼

任何幫助將不勝感激,謝謝

Sub CProcedure()

    Dim Conn As ADODB.Connection, RecordSet As ADODB.RecordSet
    Dim Command As ADODB.Command
    Dim ConnectionString As String, StoredProcName As String
    Dim range1 As ADODB.Parameter, range2 As ADODB.Parameter
    Dim SP_Param1 As String
    Dim SP_Param2 As String

    Application.ScreenUpdating = False

    Set Conn = New ADODB.Connection
    Set RecordSet = New ADODB.RecordSet
    Set Command = New ADODB.Command

    ServerName = "1111"
    DatabaseName = "dataReporting"
    UserId = "88888"
    Password = "88888"
    SP_Param1 = "StartDate"
    SP_Param2 = "EndDate"
    StoredProcName = "KPI_Report"

    ConnectionString = "PROVIDER=SQLOLEDB;DATA SOURCE=" & ServerName & _
                       ";INITIAL CATALOG=" & DatabaseName & "; User Id=" & _
                       UserId & "; Password=" & Password & ";"
    Conn.Open ConnectionString

    With Command
        .ActiveConnection = Conn
        .CommandType = adCmdStoredProc
        .CommandText = StoredProcName
        .CommandTimeout = 0
    End With

    Set range1 = Command.CreateParameter(SP_Param1, adDBDate, adParamInput, , DateSerial(2018, 1, 1))
    Command.Parameters.Append range1

    Set range2 = Command.CreateParameter(SP_Param2, adDBDate, adParamInput, , DateSerial(2018, 4, 1))
    Command.Parameters.Append range2

    Set RecordSet = Command.Execute
    Sheets("Sheet1").Range("A2").CopyFromRecordset RecordSet

    RecordSet.Close
    Conn.Close
    On Error GoTo 0
    Application.ScreenUpdating = True
    Exit Sub


End Sub

更新

我添加了以下循環,但仍然沒有運氣

'Loop through recordset and place values
RecordSet.MoveFirst
Do While RecordSet.EOF = False
    For i = 0 To RecordSet.Fields.Count - 1
        ActiveCell.Value = RecordSet.Fields(i).Value
        ActiveCell.Offset(0, 1).Activate
    Next i
    ActiveCell.Offset(1, -i).Activate
RecordSet.MoveNext
Loop

這是存儲過程代碼:

Sub storedproc()

Dim Conn As ADODB.Connection
Dim ADODBCmd As ADODB.Command
Dim rs As ADODB.RecordSet
Dim i As Integer
Dim sConnect As String

    ServerName = "1111"
    DatabaseName = "dataReporting"
    UserId = "88888"
    Password = "88888"
    SP_Param1 = "StartDate"
    SP_Param2 = "EndDate"
    StoredProcName = "KPI_Report"

 sConnect = "PROVIDER=SQLOLEDB;DATA SOURCE=" & ServerName & 
";INITIAL CATALOG=" & DatabaseName & "; User Id=" & UserId & 
"; Password=" & Password & ";"


'Establish connection
Set Conn = New ADODB.Connection
Conn.ConnectionString = sConnect
Conn.Open

'Open recordset
Set ADODBCmd = New ADODB.Command
ADODBCmd.ActiveConnection = Conn
ADODBCmd.CommandText = StoredProcName
ADODBCmd.CommandType = adCmdStoredProc
ADODBCmd.CommandTimeout = 0

Set range1 = ADODBCmd.CreateParameter(SP_Param1, adDBDate, adParamInput, , DateSerial(2018, 1, 1))
ADODBCmd.Parameters.Append range1

Set range2 = ADODBCmd.CreateParameter(SP_Param2, adDBDate, adParamInput, , DateSerial(2018, 4, 1))
ADODBCmd.Parameters.Append range2

Set rs = ADODBCmd.Execute()

'Loop through recordset and place values
rs.MoveFirst
Do While rs.EOF = False
    For i = 0 To rs.Fields.Count - 1
        ActiveCell.Value = rs.Fields(i).Value  
        ActiveCell.Offset(0, 1).Activate        
    Next i
    ActiveCell.Offset(1, -i).Activate           
rs.MoveNext
Loop


'Clean up
rs.Close
Set rs = Nothing

 End Sub

S Meaden提到GetNextRecordSet的答案解決了因存儲過程導致多個記錄集的問題。
以下代碼將所有記錄集(包括字段名稱)轉儲到工作表中(如果重復運行,請不要忘記首先清理工作表)。

...
Set rs = Command.Execute
Dim startcol As Long
startcol = 1
With ThisWorkbook.Sheets(1)
    Do While Not rs Is Nothing

        Dim col As Long
        For col = 0 To rs.Fields.Count - 1
            .Cells(1, startcol + col) = rs.Fields(col).Name
        Next col
        .Cells(2, startcol).CopyFromRecordset rs

        startcol = startcol + rs.Fields.Count + 1
        Set rs = rs.NextRecordset
    Loop
End With

因此,存儲過程需要返回多個記錄集,例如

CREATE PROCEDURE GetCarsAndCategories
AS
BEGIN
SELECT * FROM Cars
SELECT * FROM Categories
END

然后VBA代碼最初可以訪問Cars記錄集並進入類別記錄集,一個調用GetNextRecordSet

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM