Я пытаюсь подключиться к БД доступа и получить информацию.
Все идет хорошо, проект почти завершен, но мне нужно выяснить, как выйти из взаимодействия.
Я начинаю с создания приложения для доступа, затем проверяю, что для visible установлено значение false. (Я не вижу Access), но как только мой код попадает в строку app.Quit () (проверено с помощью шага, хотя) Access мигает на экране, чтобы снова исчезнуть.
Для дополнительной информации: если я сделаю шаг через окно доступа, оно не исчезнет, и я не смогу закрыть его вручную (красный х сверху справа). Приложение просто открывается заново. Я вынужден закрыть его.
Как вы можете видеть из моего закомментированного кода, я использую Process Kill, чтобы убедиться, что на экране ничего не мигает, но это приводит к тому, что мое приложение становится нестабильным (так много резервных копий БД доступа, созданных из-за сбоя).
Если вы испытываете нормальный (пустой взгляд). Пожалуйста, по крайней мере, дайте мне знать, с чего начать копать, если у вас есть интуитивное чувство.
static public DataTable ExecuteSQLToDataTable(string sql)
{
DataTable dt = new DataTable();
lock (Locks.AccessDB)
{
Microsoft.Office.Interop.Access.Application accApp = new Microsoft.Office.Interop.Access.Application();
accApp.Visible = false;
Microsoft.Office.Interop.Access.Dao.Recordset rst = null;
Microsoft.Office.Interop.Access.Dao.Database cdb = null;
try
{
accApp.OpenCurrentDatabase(ConnectionDatabase.DatabasePath, false, @"[somepassword]");
cdb = accApp.CurrentDb();
rst =
cdb.OpenRecordset(sql,
Microsoft.Office.Interop.Access.Dao.RecordsetTypeEnum.dbOpenSnapshot);
rst.MoveLast();
int recordCount = rst.RecordCount;
rst.MoveFirst();
object[,] recordsArray = (object[,])rst.GetRows(recordCount);
var rowCount = recordsArray.GetLength(1);
var columnCount = recordsArray.GetLength(0);
var dtTemp = new DataTable();
foreach (Microsoft.Office.Interop.Access.Dao.Field fld in rst.Fields)
dt.Columns.Add(fld.Name, typeof(string));
foreach (var r in Enumerable.Range(1, rowCount))
dt.Rows.Add(Enumerable.Range(1, columnCount)
.Select(c => recordsArray[c - 1, r - 1]).ToArray());
}
catch
{
//TODO Add catch
}
finally
{
GetWindowThreadProcessId(accApp.hWndAccessApp(), out int id);
if (rst != null) { Marshal.ReleaseComObject(rst); }
if (cdb != null) { Marshal.ReleaseComObject(cdb); }
if (accApp != null) { accApp.Quit(); Marshal.ReleaseComObject(accApp); }
rst = null;
cdb = null;
accApp = null;
//Process.GetProcessById(id).Kill();
}
return dt;
}
}
Locks - это статический класс Locks.AccessDB - это просто пустой объект