2011-05-04 100 views
3

我想從Excel運行存儲過程。我知道如何做到這一點而不使用動態日期,但我需要日期範圍是動態的。從Excel運行存儲過程

Sub TestStoredProcedure() 

    Dim CServer As String 
    Dim CDatabase As String 
    Dim CLogon As String 
    Dim CPass As String 
    Dim StartDate As Date 
    Dim EndDate As Date 
    Dim TStartDate As String 
    Dim TEndDate As String 

    CServer = "111111"   ' Your server name here 
    CDatabase = "111111" ' Your database name here 
    CLogon = "11111111"  ' your logon here 
    CPass = "111111"    ' your password here 

    Dim Cmd1 As New ADODB.Command 
    Dim rs As New ADODB.Recordset 
    Dim intTemp As Integer 

    Set Cmd1 = New ADODB.Command 

    Cmd1.ActiveConnection = cn 
    Cmd1.CommandText = "callstatisticsbyQ" 
    Cmd1.CommandType = adCmdStoredProc 

    Cmd1.Parameters.Refresh 
    Cmd1.Parameters(0).Value = Worksheets("Sheet2").Range("A1") 
    Cmd1.Parameters(1).Value = Worksheets("Sheet2").Range("A2") 
    Cmd1.Parameters(2).Value = Worksheets("Sheet2").Range("A3") 

    Set rs = Cmd1.Execute() 

    rs.Open Cmd1 
    Worksheets("Procedure Export").Range("A1").CopyFromRecordset rs 

    Call DumpSP("prcGetData", "", "", Worksheets("Procedure Export").Range("A1")) 

End Sub 

我得到一個錯誤說一些關於用戶定義類型沒有定義

回答

4

要使用ADO,請單擊VBA IDE中的工具 - >引用&勾選「Microsoft ActiveX Data Objects」 - 最好是其最高版本。

此外,您使用cn作爲連接,但它沒有在該子中定義(假設它不是全局的)&您可能需要Set Cmd1.ActiveConnection = cn

此外看一看this,它定義了輸入(adParaminput)預先PARAMATERS而不是使用.Refresh這是非常低效的(需要前往服務器)例如

更新:

rem for create procedure callstatisticsbyQ (@i int, @c varchar(10)) as select 1234; 

Dim cn As ADODB.Connection 
Dim Cmd1 As ADODB.Command 
Dim rs As ADODB.Recordset 

Set cn = New ADODB.Connection 
Set Cmd1 = New ADODB.Command 
Set Cmd1 = New ADODB.Command 

cn.Open "Provider=SQLNCLI10;Server=1.2.3.4;Database=x;Uid=x; Pwd=x;" 

Set Cmd1.ActiveConnection = cn 
Cmd1.CommandText = "callstatisticsbyQ" 
Cmd1.CommandType = adCmdStoredProc 
Cmd1.Parameters.Append Cmd1.CreateParameter("p1", adInteger, adParamInput, , Worksheets("Sheet2").Range("A1")) 
Cmd1.Parameters.Append Cmd1.CreateParameter("p2", adVarChar, adParamInput, 20, Worksheets("Sheet2").Range("A2")) 

Set rs = Cmd1.Execute() 
MsgBox rs(0) 

rs.Close 
cn.Close 
+0

感謝讓我進一步但仍然不工作:/ – 2011-05-04 20:43:02

+0

調用DumpSP(「prcGetData」,「」,「」,工作表(「過程導出」)。範圍(「A1」)) – 2011-05-04 20:43:18

+0

更新了一個示例 – 2011-05-04 20:58:23