Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 在MS Access中运行异步查询_Ms Access_Vba_Asynchronous_Odbc - Fatal编程技术网

Ms access 在MS Access中运行异步查询

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

我正在尝试异步运行一些繁重的查询,但不知道如何对.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)

这甚至不会打开连接,因为连接字符串似乎是错误的。

我可以说对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查询。