Quit () заставляет Access на мгновение стать видимым - PullRequest
2 голосов
/ 01 октября 2019

Я пытаюсь подключиться к БД доступа и получить информацию.

Все идет хорошо, проект почти завершен, но мне нужно выяснить, как выйти из взаимодействия.

Я начинаю с создания приложения для доступа, затем проверяю, что для 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 - это просто пустой объект

1 Ответ

1 голос
/ 01 октября 2019

Я склонен полагать, что Access делает что-то свое, чтобы показать себя на экране, когда вы вызываете все Quit ().

Вы можете обойти эту проблему, используя SetWindowPos, чтобы переместить окно Access из окнаэкран, так что вы никогда не увидите его при вызове Quit ().

...