在MS Access中运行异步查询

时间:2011-01-27 08:51:28

标签: 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={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)

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

2 个答案:

答案 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

     

结束