在 Access 中使用 ODBC 连接到 MS SQL Server 2012:手动调用查询与在 VBA 中调用查询之间存在巨大的时间差异
Using ODBC in Access to connect to MS SQL Server 2012: huge time difference between calling query manually and in VBA
我在使用 DAO.QueryDef 从 MS Access 2010 中的 MS SQL Server 2012 检索数据时遇到问题。该设置是 MS SQL Server 2012 作为后端,在 MS Access 2010 中使用链接 tables、视图、传递查询、存储过程和函数实现了 GUI。两者之间的连接是通过ODBC驱动建立的 "SQL Server".
当我手动执行查询时,即在 MS Access 的 "Queries" 部分双击它,然后我被要求输入两个输入参数,qry 需要几秒钟才能 return 数据(进入本地 Access GUI 中的临时 table)。
然而,当我尝试在 VBA 代码中调用某些查询时,它花费的时间是手动执行的大约 10 倍,或者我什至超时(运行时错误 3164:ODBC 调用失败)。
有问题的代码归结为:
Private Sub cBCreate_Click()
Dim thisDb As DAO.Database
Dim qdf As DAO.QueryDef
[...] //File Dialog
Set thisDb = CurrentDb
Set qdf = thisDb.QueryDefs("qry_10")
qdf.Parameters!parAbrg = aInputValue //from unbound combo box
qdf.Parameters!parDate = bInputValue //from unbound combo box
qdf.Execute
[...] //sth else
qdf.Close
Set qdf = Nothing
Set thisDb = Nothing
End Sub
有没有人遇到过这种情况并且可能有解决方案?非常感谢任何帮助或想法。
-Stefan
更新
parA
和 parB
都是从位于未绑定窗体上的两个未绑定组合框派生的输入值,在该窗体上单击了按钮 cBCreate。 parA
是由 2..4 个数字字符组成的字符串(例如“2180”),parB
是一个类似于德国日期的字符串(例如“01.04.2016”)。当我如上所述手动触发 qry 时,我以这种格式输入它们。
qry 触发器没什么特别的。它从一个视图中检索数据 LEFT JOINing 它与一个 table 在两个 ID 上。输入参数在 WHERE 子句中使用。这是代码:
SELECT
{36 fields}
INTO
tblExportTmp
FROM
vw_09 wvn
LEFT JOIN
tblAbger AS awg
ON
(wvn.wOutId = awg.wOutId) AND
(wvn.wInId = awg.wInId)
WHERE
wgAbrg = [parAbrg] AND
(
(wOutTime Is Not Null AND
CVDate(wOutTime) < DateAdd('m', 1, [parDate])) OR
(awg.wInId Is Null AND
awg.wOutId Is Null AND
DateDiff('m', CVDate(wOutTime), [parDate]) > 0) Or
(outTime Is Null AND
DateDiff('m', CVDate(wInTime), [parDate]) >= 0)
)
AND
(
awg.wInId Is Null AND
awg.wOutId Is Null
)
ORDER BY
{5 fields} ASC;
文件对话框用于指定最终应将检索到的数据保存到的 XLSX 文件。
更新 2
是的,在单击触发 VBA 代码的按钮 cBCreate 之前,我从所述组合框中执行 select aInputValue
和 bInputValue
。 view 和 table 都从同一个 SQL 服务器链接。 wInTime
和 wOutTime
是原始 table 和视图中的时间戳,但由于美国和德国时间戳之间的混淆而链接为文本字段。
我添加了错误处理,它说查询显然超时。我将超时设置为 600,这样它至少可以给出结果,但是与手动执行查询相比,它花费的时间太长了。
在查询中添加一个 PARAMETERS 部分,并使用它们的数据类型(字符串和日期)显式声明参数会有所帮助。
(其实我有点惊讶。)
组合框值也必须转换为适当的数据类型。
我在使用 DAO.QueryDef 从 MS Access 2010 中的 MS SQL Server 2012 检索数据时遇到问题。该设置是 MS SQL Server 2012 作为后端,在 MS Access 2010 中使用链接 tables、视图、传递查询、存储过程和函数实现了 GUI。两者之间的连接是通过ODBC驱动建立的 "SQL Server".
当我手动执行查询时,即在 MS Access 的 "Queries" 部分双击它,然后我被要求输入两个输入参数,qry 需要几秒钟才能 return 数据(进入本地 Access GUI 中的临时 table)。
然而,当我尝试在 VBA 代码中调用某些查询时,它花费的时间是手动执行的大约 10 倍,或者我什至超时(运行时错误 3164:ODBC 调用失败)。
有问题的代码归结为:
Private Sub cBCreate_Click()
Dim thisDb As DAO.Database
Dim qdf As DAO.QueryDef
[...] //File Dialog
Set thisDb = CurrentDb
Set qdf = thisDb.QueryDefs("qry_10")
qdf.Parameters!parAbrg = aInputValue //from unbound combo box
qdf.Parameters!parDate = bInputValue //from unbound combo box
qdf.Execute
[...] //sth else
qdf.Close
Set qdf = Nothing
Set thisDb = Nothing
End Sub
有没有人遇到过这种情况并且可能有解决方案?非常感谢任何帮助或想法。
-Stefan
更新
parA
和 parB
都是从位于未绑定窗体上的两个未绑定组合框派生的输入值,在该窗体上单击了按钮 cBCreate。 parA
是由 2..4 个数字字符组成的字符串(例如“2180”),parB
是一个类似于德国日期的字符串(例如“01.04.2016”)。当我如上所述手动触发 qry 时,我以这种格式输入它们。
qry 触发器没什么特别的。它从一个视图中检索数据 LEFT JOINing 它与一个 table 在两个 ID 上。输入参数在 WHERE 子句中使用。这是代码:
SELECT
{36 fields}
INTO
tblExportTmp
FROM
vw_09 wvn
LEFT JOIN
tblAbger AS awg
ON
(wvn.wOutId = awg.wOutId) AND
(wvn.wInId = awg.wInId)
WHERE
wgAbrg = [parAbrg] AND
(
(wOutTime Is Not Null AND
CVDate(wOutTime) < DateAdd('m', 1, [parDate])) OR
(awg.wInId Is Null AND
awg.wOutId Is Null AND
DateDiff('m', CVDate(wOutTime), [parDate]) > 0) Or
(outTime Is Null AND
DateDiff('m', CVDate(wInTime), [parDate]) >= 0)
)
AND
(
awg.wInId Is Null AND
awg.wOutId Is Null
)
ORDER BY
{5 fields} ASC;
文件对话框用于指定最终应将检索到的数据保存到的 XLSX 文件。
更新 2
是的,在单击触发 VBA 代码的按钮 cBCreate 之前,我从所述组合框中执行 select aInputValue
和 bInputValue
。 view 和 table 都从同一个 SQL 服务器链接。 wInTime
和 wOutTime
是原始 table 和视图中的时间戳,但由于美国和德国时间戳之间的混淆而链接为文本字段。
我添加了错误处理,它说查询显然超时。我将超时设置为 600,这样它至少可以给出结果,但是与手动执行查询相比,它花费的时间太长了。
在查询中添加一个 PARAMETERS 部分,并使用它们的数据类型(字符串和日期)显式声明参数会有所帮助。
(其实我有点惊讶。)
组合框值也必须转换为适当的数据类型。