Access VBA Parameter in passthrough query to SQL Server

后端 未结 4 1586
情歌与酒
情歌与酒 2020-12-11 10:51

I have several queries in an MS Access database. Some of these use parameters. I use the following code in VBA to provide the query with these parameters:

VB

4条回答
  •  粉色の甜心
    2020-12-11 11:53

    Consider building a named stored procedure that resides in SQL Server and have MS Access call it passing parameters using ADO as opposed to your current DAO method since you require parameterization. Then bind results to a recordset:

    SQL Server Stored Proc

    CREATE PROCEDURE myStoredProc 
       @InvLineEntryDateBegin DATE = '2017-01-01',
       @InvLineEntryDateEnd DATE = '2017-05-31'
    AS
    
    BEGIN
       SET NOCOUNT ON;    
    
       SELECT WarehouseCode, Count(PickOrderNr) as Som
       FROM ( bla bla bla ... ;
    
    END
    

    VBA

    ' SET REFERENCE TO Microsoft ActiveX Data Object #.# Library
    Dim conn As ADODB.Connection, cmd As ADODB.Command, rst As ADODB.Recordset
    Dim startDate As Date, endDate As Date   
    
    If IsNull(Me.dpFrom) Or IsNull(Me.dpTo) Then
        MsgBox "Please select a date!", vbCritical, "MISSING DATE"
        Exit Sub
    End if    
    If (Me.dpFrom.Value > Me.dpTo.Value) Then
        MsgBox "Start date is bigger than the end date!", vbCritical, "INCORRECT RANGE"
        Exit Sub
    End if
    
    startDate = Me.dpFrom.Value: endDate = Me.dpTo.Value
    
    ' OPEN CONNECTION
    Set conn = New ADODB.Connection         
    conn.Open "DRIVER={SQL Server};server=servername;database=databasename;UID=username;PWD=password;"
    
    ' OPEN/DEFINE COMMAND OBJECT
    Set cmd = New ADODB.Command     
    With cmd
        .ActiveConnection = conn
        .CommandText = "myStoredProc"
        .CommandType = adCmdStoredProc
    
        ' BIND PARAMETERS
        .Parameters.Append .CreateParameter("@InvLineEntryDateBegin", adDate, adParamInput, 0, startDate)
        .Parameters.Append .CreateParameter("@InvLineEntryDateEnd", adDate, adParamInput, 0, endDate)
    En With
    
    ' BIND RESULTS TO RECORDSET
    Set rst = cmd.Execute
    ...
    

提交回复
热议问题