我正在尝试连接到access DB并检索信息。
一切都很顺利,项目几乎完成了,但我需要弄清楚如何退出互操作。
我首先创建我的access应用程序,然后确保visible设置为false。(我看不到Access),但是我的代码一到app.Quit()行(使用step验证),Access就会在屏幕上闪现,然后再次消失。
对于添加的信息:如果我执行了一个步骤,访问窗口不会消失,也不能手动关闭它(红色x右上角)。应用程序只是重新打开空白。我不得不强行关闭它。
正如您在我注释掉的代码中所看到的,我使用了一个进程终止来确保屏幕上没有闪烁,但这会导致我的应用程序变得不稳定(由于崩溃而创建了许多access DB备份)。
如果你正在经历正常的(空洞的凝视)。如果你有直觉,请至少让我知道从哪里开始挖掘。
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;
}
}Lock是一个静态类,Locks.AccessDB只是一个空对象
发布于 2019-10-01 22:12:50
我倾向于相信,当您调用all Quit()时,Access会自动在屏幕上显示自己。
您可以使用SetWindowPos将访问窗口移出屏幕,以便在调用Quit()时看不到它,从而解决此问题。
https://stackoverflow.com/questions/58176221
复制相似问题