在MS Access中运行异步查询

问题描述:

我试图运行一些沉重的查询异步,但不知道如何为.mdb文件。在MS Access中运行异步查询

这是我到目前为止有:

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

在这[相关问题]讨论(http://stackoverflow.com/questions/2898953/multi-thread-in-ms-access-async-processing)可以帮助 – richaux 2011-01-27 09:04:37

你的第一个5(非空白)线在无所事事的例。这些行试图打开一个连接,但后来处理更新查询的代码没有使用该连接。

您应该知道您正在使用的Round()函数可能不会返回您所期望的。 VBA中的Round()函数使用“Bankers Rounding”或“round half to even”逻辑。 Round(15.665.2)和Round(15.675.2)都将返回15.67。

您的最后一行试图从您的更新语句中打开记录集。更新语句不返回记录,所以没有记录集返回。如果它要返回一个记录集,你会想要使用像“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""" 

我可以谈论对JET数据源执行这些事情,但是我已经使用这个对SQL服务器,所以它应该工作。诀窍是使用ADO并使用选项adAsyncExecute激发execute语句。我没有确切的代码来的手,但这里是我的头

昏暗DbCon顶部的一个粗略的版本ADODB.Connection

昏暗dbCmd作为ADODB.Command

DbCon。的ConnectionString =”你的 连接字符串”

随着dbCmd
.commandtype =为adCmdText

.comman DTEXT =”你长的SQL UPDATE语句”
.ActiveConnection = dbcon

.Execute,adAsyncExecute

末随着

+0

嗯,我不知道认为它适用于MDB数据库,因为它抱怨OLE DB对象'当前提供商不支持'' – skerit 2011-01-27 12:07:30

+0

值得一试,您能告诉我它出错代码的哪一行吗? – 2011-01-27 13:09:46