首页 文章

如何使用VBA动态SQL SELECT语句调用MS Access参数查询

提问于
浏览
1

我搜索过MSDN,StackOverflow,SQLServer Central和太多网站 . 我已经尝试了几天,在Excel VBA代码中使用动态SQL SELECT语句找到在MS Access中执行参数查询的方法 . 我正在使用的系统与SQL Server TVF配合得非常好,但由于失去了服务器支持,我必须将其转换为Access . VBA代码首先循环访问Excel中的“输入”工作表,获取用于构建动态SQL SELECT语句的参数值和函数/查询名称 . 下面是构建连接的代码,并仅针对其中一个只需要1个输入参数的查询(有20个)调用Access Query:

Dim strSQL

' set up our connection
strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\PathToDB Tables 2013-12-13.accdb;"
Set conn = CreateObject("ADODB.Connection")
conn.Open strConnection
' open the view and create the report
Set rs = CreateObject("ADODB.recordset")
Application.ODBCTimeout = 0
conn.CommandTimeout = 0
strSQL = "select * FROM "
strSQL = strSQL & strFunction
strSQL = strSQL & " (" & strParameters & ");"
'strSQL = strSQL & strOrderBy
rs.Open strSQL, conn

此时strSQL中的值是 SELECT * FROM Report_1_2_StaffAdds (#12/31/2013#);

rs.Open strSQL,conn中出现错误错误消息'FROM子句中的语法错误' .

这是MS Access查询:(查询名称为Report_1_2_StaffAdds)

PARAMETERS [previous_month] DateTime; SELECT [1_2_StaffAddsPart1].Unit, [1_2_StaffAddsPart1].Role, [1_2_StaffAddsPart1].Start_Date, [1_2_StaffAddsPart2].First_Worked, [1_2_StaffAddsPart2].Last_Worked, [1_2_StaffAddsPart1].Emp_Name, [1_2_StaffAddsPart1].Emp_Id, [1_2_StaffAddsPart2].Hours_to_Date FROM 1_2_StaffAddsPart1 INNER JOIN 1_2_StaffAddsPart2 ON [1_2_StaffAddsPart1].Emp_Id = [1_2_StaffAddsPart2].Emp_Id;

任何帮助都感激不尽 . 我相信如果我能得到答案,我可以修改它以包含最多3个输入参数,具体取决于在给定时间执行哪个Access查询 .

1 回答

  • 2

    在我看来,您试图将参数值包含在包含 SELECT 语句的字符串中 . 但是,我正在尝试这样做,所以我将为您提供一个简单的测试参数查询,该查询从 ADODB.Command 对象打开一个记录集 .

    这是以下代码的立即窗口输出:

    PARAMETERS which_date DateTime;
    SELECT * FROM tblFoo
    WHERE datetime_field = [which_date];
    id            datetime_field
     27           2/11/2014 10:16:58 AM
    

    码:

    Dim cmd As Object ' ADODB.Command
    Dim conn As Object ' ADODB.Connection
    Dim rs As Object ' ADODB.Recordset
    Dim strConnection As String
    Dim strSql As String
    
    strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=C:\share\Access\database1.mdb;"
    Set conn = CreateObject("ADODB.Connection")
    conn.Open strConnection
    
    strSql = "PARAMETERS which_date DateTime;" & vbCrLf & _
        "SELECT * FROM tblFoo" & vbCrLf & _
        "WHERE datetime_field = [which_date];"
    Debug.Print strSql
    
    Set cmd = CreateObject("ADODB.Command")
    cmd.ActiveConnection = conn
    cmd.CommandText = strSql
    Set rs = cmd.Execute(, CDate("2/11/2014 10:16:58 AM"))
    With rs
        If Not (.BOF And .EOF) Then
            Debug.Print "id", "datetime_field"
            Debug.Print !id, !datetime_field
        End If
        .Close
    End With
    

相关问题