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

时间:2014-02-11 21:45:52

标签: sql excel vba ms-access access-vba

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

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 个答案:

答案 0 :(得分: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