我已经和OleDbConnection打了一段时间了,现在我想让它不被缓存。基本上,我是在访问一个共享的access数据库,该数据库正在从另一个应用程序写入,然后我在读取值(检查它是否通过最后一次写入时间和随后的1秒延迟刷新)。
不幸的是,这是完全不可靠的。
我一直在阅读(并且变得疯狂)如何禁用连接池,然后在每次可能的更新之后,在重新连接之前执行以下操作:

_connection.Close();
_connection.Dispose();
_connection = null;
OleDbConnection.ReleaseObjectPool();
GC.Collect();

除此之外,连接字符串还使用OLE DB Services = -2禁用连接池。最后,我还在jet 4.0的注册表中将PageTimeout更改为'10'。
不幸的是,所有这些措施都没有效果。现在我唯一能想到做的就是在this Microsoft KB Article中提到的事情,然后调用JRO.JetEngine.RefreshCache。唯一的问题是它的参数是ADODB.Connection。我不想重写我的整个数据库层,也不想重写我的软件读取记录的地方,以使用一个遗留的com对象来实现这一功能,但看起来这可能是唯一的方法。
我的问题是,目前正在进行使用adodb(甚至ado.net!),是否可以禁用OleDbConnection的缓存?

最佳答案

最后,我找到了一个解决方法:使用odbcconnection而不是oledbconnection。
这是旧代码:

string mdbConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + mdbFile + ";OLE DB Services=-2";
using (OleDbConnection conn = new OleDbConnection(mdbConnectionString)) {
    conn.Open();
    //Do your query
}

这是新的:
string mdbConnectionString = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=" + mdbFile;
using (OdbcConnection conn = new OdbcConnection(mdbConnectionString)) {
    conn.Open();
    //Do your query
}

一切正常。

08-19 03:25