Выполнение асинхронного запроса в MS Access - PullRequest
1 голос
/ 27 января 2011

Я пытаюсь выполнить некоторые тяжелые запросы асинхронно, но не могу понять, как это сделать для файла .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 ]

2 голосов
/ 27 января 2011

Ваши первые 5 (непустые) строки ничего не делают в вашем примере.Эти строки пытаются открыть соединение, но ваш более поздний код, который имеет дело с запросом на обновление, не использует это соединение.

Вы должны знать, что используемая вами функция Round () может не возвращать то, чтовы ожидаете.Функция Round () в VBA использует логику «округления банкиров» или «округление от половины до четного».И 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 голос
/ 27 января 2011

Я могу говорить о выполнении этого на источнике данных JET, однако я использовал его на сервере SQL, поэтому он должен работать.Хитрость заключается в том, чтобы использовать ADO и запустить оператор execute с параметром adAsyncExecute.У меня нет точного кода под рукой, но вот примерная версия с моей головы

Dim DbCon как ADODB.Connection

Dim dbCmd как ADODB.Command

DbCon.ConnectionString = ”Строка подключения”

С dbCmd
.commandtype = adCmdText

.commandtext = «Ваш длинный оператор обновления SQL»
.ActiveConnection= dbcon

.Execute,, adAsyncExecute

Конец

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...