Ms access 在MS Access中运行异步查询
我正在尝试异步运行一些繁重的查询,但不知道如何对.mdb文件执行此操作 这就是我到目前为止所做的:Ms access 在MS Access中运行异步查询,ms-access,vba,asynchronous,odbc,Ms Access,Vba,Asynchronous,Odbc,我正在尝试异步运行一些繁重的查询,但不知道如何对.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={M
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)
这甚至不会打开连接,因为连接字符串似乎是错误的。我可以说对JET数据源执行此操作,但是我对SQL server使用了此操作,因此它应该可以工作。诀窍是使用ADO并使用adAsyncExecute选项触发execute语句。我手头没有确切的代码,但这是一个粗略的版本 Dim DbCon作为ADODB.连接 Dim dbCmd作为ADODB.Command DbCon.ConnectionString=“您的 “连接字符串” 使用dbCmd
.commandtype=adCmdText .commandtext=“您的长SQL更新语句”
.ActiveConnection=dbcon .Execute,adAsyncExecute 以 在您的示例中,前5行(非空白)没有任何作用。这些行正试图打开连接,但处理更新查询的后续代码未使用该连接 您应该知道,您正在使用的Round()函数可能不会返回您期望的结果。VBA中的Round()函数使用“四舍五入”或“半舍五入到偶数”逻辑。圆形(15.665,2)和圆形(15.675,2)将返回15.67 最后一行尝试从update语句中打开记录集。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"""
Shell“wscript”C:\\UpdateActueel.vbs“”
本文中的讨论可能会有所帮助。嗯,我认为它不适用于MDB数据库,因为它抱怨OLE DB对象“当前提供程序不支持这些对象”。值得一试,您能告诉我它在哪行代码上出错了吗?我想ADO记录集可以是DML查询。