2011-01-27 99 views
1

我試圖運行一些沉重的查詢異步,但不知道如何爲.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

回答

3

你的第一個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""" 
1

我可以談論對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