Итак, я пытаюсь автоматизировать Microsoft Access с C#. Очевидно, что вы не можете выполнять код VBA асинхронно в VBA, но моя идея состояла в том, чтобы перевести это из C# с помощью делегатов.Будет ли этот код VBA выполняться асинхронно
У нас есть устаревшая система отчетности, которая запускает сотни запрограммированных запросов для получения информации, и эти запросы выполняются синхронно внутри макросов. Каждый запрос был спроектирован с использованием конструктора запросов MS Access и запрашивает базу данных MySql по ODBC. Они занимают 2-3 минуты для запуска, а макрос может содержать < = 20 запросов, то есть макрос займет большую часть часа для запуска. Если бы я запустил эти асинхронные операции, я мог бы запустить весь макрос через пару минут.
Мой полный C# код ниже:
using System;
using Microsoft.Office.Interop.Access;
namespace AsyncVBA
{
class Program
{
private static Application ap;
private delegate void ExportThread(string queryName, string exportLocation);
private static int count;
static void Main(string[] args)
{
var dbName = @"C:\Users\JMK\Desktop\MyDatabase.accdb";
count = 0;
ExportThread queryThread = new ExportThread(ExportQuery);
ap = new Application();
ap.OpenCurrentDatabase(dbName);
queryThread.BeginInvoke("qryOne", @"C:\Users\JMK\Desktop\x\one.xlsx", null, null);
queryThread.BeginInvoke("qryTwo", @"C:\Users\JMK\Desktop\x\two.xlsx", null, null);
queryThread.BeginInvoke("qryThree", @"C:\Users\JMK\Desktop\x\three.xlsx", null, null);
queryThread.BeginInvoke("qryFour", @"C:\Users\JMK\Desktop\x\four.xlsx", null, null);
queryThread.BeginInvoke("qryFive", @"C:\Users\JMK\Desktop\x\five.xlsx", null, null);
queryThread.BeginInvoke("qrySix", @"C:\Users\JMK\Desktop\x\six.xlsx", null, null);
queryThread.BeginInvoke("qrySeven", @"C:\Users\JMK\Desktop\x\seven.xlsx", null, null);
queryThread.BeginInvoke("qryEight", @"C:\Users\JMK\Desktop\x\eight.xlsx", null, null);
queryThread.BeginInvoke("qryNine", @"C:\Users\JMK\Desktop\x\nine.xlsx", null, null);
queryThread.BeginInvoke("qryTen", @"C:\Users\JMK\Desktop\x\ten.xlsx", null, null);
while (count < 10)
{
Console.ReadLine();
}
ap.CloseCurrentDatabase();
}
private static void ExportQuery(string queryName, string exportLocation)
{
ap.DoCmd.TransferSpreadsheet(AcDataTransferType.acExport, AcSpreadSheetType.acSpreadsheetTypeExcel9, queryName, exportLocation);
count++;
}
}
}
У меня возникли два вопроса, в настоящее время, во-первых, что мой код до сих пор, кажется, выполнение синхронно, это могло быть связано с ограничением в MS Access. Я предполагаю, что MS Access ставит в очередь запросы, получая их или что-то в этом роде. Вторая, менее важная проблема заключается в том, что мой счет, кажется, не увеличивается.
Куда я иду не так?
Благодаря
Учитывается статическая переменная? – Paparazzi
Да, это проблема? – JMK
Нет, он должен запустить код VBA. Асинхронно используя C#, экспорт является всего лишь примером типа кода VBA, который я хочу запустить. – JMK