我正在尝试异步运行一些繁重的查询,但无法弄清楚如何为.mdb文件执行此操作。
这是我到目前为止所做的:
Dim wrksp As Workspace, qdf As QueryDef, rst As Recordset
Dim cnn As Connection, strConnect As String
Set wrksp = CreateWorkspace("ODBCDirect", "Admin", "", dbUseODBC)
strConnect = "ODBC;Driver={Microsoft Access Driver (*.mdb)};Database=F:\Databank\webshop_ingrid.mde;Uid=;Pwd=;"
Set cnn = wrksp.OpenConnection("", dbDriverNoPrompt, False, _
strConnect)
Dim rs As Recordset
Dim strQuery As String
strQuery = "UPDATE ((((((tblSkuActueel LEFT JOIN qryStockSkuMetLaatsteDatumSubQuery ON tblSkuActueel.sku = qryStockSkuMetLaatsteDatumSubQuery.sku) LEFT JOIN " & _
"qrySkuCapNieuwste ON tblSkuActueel.sku = qrySkuCapNieuwste.sku) LEFT JOIN qrySkuListNieuwste ON tblSkuActueel.sku = qrySkuListNieuwste.sku) LEFT JOIN " & _
"qrySkuPPDNieuwste ON tblSkuActueel.sku = qrySkuPPDNieuwste.sku) INNER JOIN qrySkuApexNieuwsteMetBtw ON tblSkuActueel.sku = qrySkuApexNieuwsteMetBtw.sku) " & _
"LEFT JOIN qrySkuSpecialNieuwsteDS ON tblSkuActueel.sku = qrySkuSpecialNieuwsteDS.sku) LEFT JOIN qrySkuSpecialNieuwsteNB ON tblSkuActueel.sku = " & _
"qrySkuSpecialNieuwsteNB.sku SET tblSkuActueel.stock = qryStockSkuMetLaatsteDatumSubQuery.aantal, tblSkuActueel.apex = qrySkuApexNieuwsteMetBtw.apex, " & _
"tblSkuActueel.cap = qrySkuCapNieuwste.cap, tblSkuActueel.listprice = qrySkuListNieuwste.listprice, tblSkuActueel.ppd = qrySkuPPDNieuwste.ppd, " & _
"tblSkuActueel.procent = qrySkuApexNieuwsteMetBtw.procent, tblSkuActueel.apin = Round(qrySkuApexNieuwsteMetBtw.apex*qrySkuApexNieuwsteMetBtw.procent,2), " & _
"tblSkuActueel.BtwId = qrySkuApexNieuwsteMetBtw.btwid, tblSkuActueel.specialpricenb = [qryskuspecialnieuwstenb].[specialprice], " & _
"tblSkuActueel.specialpriceds = [qryskuspecialnieuwsteds].[specialprice]"
Set rs = Object.OpenRecordset(strQuery, dbOpenDynaset, dbSeeChanges + dbRunAsync)
这甚至不会打开连接,因为连接字符串似乎是错误的。
答案 0 :(得分:2)
您的前5行(非空白)行在您的示例中无效。这些行正在尝试打开连接,但是后面处理更新查询的代码没有使用该连接。
您应该知道您正在使用的Round()函数可能无法返回您期望的内容。 VBA中的Round()函数使用“Bankers Rounding”或“round half to even”逻辑。回合(15.665,2)和回合(15.675,2)将返回15.67。
您的最后一行是尝试从更新语句中打开记录集。 update语句不返回记录,因此没有要返回的记录集。如果要返回记录集,则需要使用“CurrentDB.OpenRecordset”而不是“Object.OpenRecordset”。
关于此查询的异步运行,您可能无法获得所需内容。 MS Access将在本地计算机上处理查询。如果它使用JET(MS Access)数据库,我不知道异步运行查询的方法。我怀疑即使有一个命令通过你的VBA代码异步运行查询,它仍然会在你的应用程序的上下文中运行并使其陷入困境。
如果您在查询运行时尝试让应用程序响应,我建议将更新移动到单独的进程,例如VBScript文件。
将以下代码保存在名为UpdateActueel.vbs
的文件中strQuery = "UPDATE ((((((tblSkuActueel LEFT JOIN qryStockSkuMetLaatsteDatumSubQuery ON tblSkuActueel.sku = qryStockSkuMetLaatsteDatumSubQuery.sku) LEFT JOIN " & _
"qrySkuCapNieuwste ON tblSkuActueel.sku = qrySkuCapNieuwste.sku) LEFT JOIN qrySkuListNieuwste ON tblSkuActueel.sku = qrySkuListNieuwste.sku) LEFT JOIN " & _
"qrySkuPPDNieuwste ON tblSkuActueel.sku = qrySkuPPDNieuwste.sku) INNER JOIN qrySkuApexNieuwsteMetBtw ON tblSkuActueel.sku = qrySkuApexNieuwsteMetBtw.sku) " & _
"LEFT JOIN qrySkuSpecialNieuwsteDS ON tblSkuActueel.sku = qrySkuSpecialNieuwsteDS.sku) LEFT JOIN qrySkuSpecialNieuwsteNB ON tblSkuActueel.sku = " & _
"qrySkuSpecialNieuwsteNB.sku SET tblSkuActueel.stock = qryStockSkuMetLaatsteDatumSubQuery.aantal, tblSkuActueel.apex = qrySkuApexNieuwsteMetBtw.apex, " & _
"tblSkuActueel.cap = qrySkuCapNieuwste.cap, tblSkuActueel.listprice = qrySkuListNieuwste.listprice, tblSkuActueel.ppd = qrySkuPPDNieuwste.ppd, " & _
"tblSkuActueel.procent = qrySkuApexNieuwsteMetBtw.procent, tblSkuActueel.apin = Round(qrySkuApexNieuwsteMetBtw.apex*qrySkuApexNieuwsteMetBtw.procent,2), " & _
"tblSkuActueel.BtwId = qrySkuApexNieuwsteMetBtw.btwid, tblSkuActueel.specialpricenb = [qryskuspecialnieuwstenb].[specialprice], " & _
"tblSkuActueel.specialpriceds = [qryskuspecialnieuwsteds].[specialprice]"
Set DB = GetObject("F:\Databank\webshop_ingrid.mde")
DB.Execute strQuery
在您的VBA代码中,使用以下行运行脚本。
Shell "wscript ""C:\<Path to file>\UpdateActueel.vbs"""
答案 1 :(得分:1)
我可以谈论针对JET数据源执行此操作但是我已经将其用于SQL服务器,因此它应该可以工作。诀窍是使用ADO并使用选项adAsyncExecute触发execute语句。我手边没有准确的代码,但这是一个粗略的版本
Dim DbCon as ADODB.Connection
将dbCmd调暗为ADODB.Command
DbCon.ConnectionString =”您 连接字符串“
使用dbCmd
.commandtype = adCmdText.commandtext =“您的长SQL更新声明”
.ActiveConnection = dbcon.Execute ,, adAsyncExecute
结束