我已经和OleDbConnection斗争了一段时间了,试图让它不缓存。基本上,我正在访问一个共享访问数据库,该数据库是从另一个应用程序写入的,然后我读回值(通过上次写入时间和随后的1秒延迟检查它是否被刷新)。
不幸的是,这是完全不可靠的。
我一直在阅读(快要发疯了)如何禁用连接池,随后,在每次可能的更新之后,在重新连接之前执行以下操作:
_connection.Close();
_connection.Dispose();
_connection = null;
OleDbConnection.ReleaseObjectPool();
GC.Collect();除此之外,连接字符串还会禁用与OLE DB Services = -2的连接池。最后,我还在Jet4.0的注册表中将PageTimeout更改为'10‘。
不幸的是,所有这些措施都没有效果。现在我唯一能想到做的事情就是在this Microsoft KB Article中提到的事情,然后调用JRO.JetEngine.RefreshCache。唯一的问题是它的参数是一个ADODB.Connection。我不愿意重写我的整个数据库层和我的软件正在读取的记录所在的位置,以使用遗留的COM对象来实现这一功能,但这似乎是唯一的方法。
我的问题是,在进行重写以使用ADODB (甚至不是ADO.NET!)的同时,是否可以禁用OleDbConnection的缓存
发布于 2019-01-08 12:28:46
最后,我找到了一个解决办法:用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
}所有的工作都很好。
发布于 2014-10-07 22:28:02
您可能会幸运地将";Jet OLEDB:Flush Transaction Timeout“属性设置为0或某个较小的数字。
发布于 2019-09-27 12:58:32
32位应用程序
在32位C#应用程序中,我多年来一直在这样做以刷新缓存:
public static void RefreshDatabaseCache(
string connectionString)
{
// The type of the ADODB connection. Used for dynamically creating.
var adodbType = Type.GetTypeFromProgID(@"ADODB.Connection");
// The main ADODB connection object.
var adodbInstance = Activator.CreateInstance(adodbType);
// --
// Open the connection.
adodbType.InvokeMember(
@"Open",
BindingFlags.InvokeMethod,
null,
adodbInstance,
new object[]
{
connectionString,
string.Empty,
string.Empty,
0
});
try
{
// The type of the JET engine. Used for dynamically creating.
var jroType = Type.GetTypeFromProgID(@"JRO.JetEngine");
// The main JET engine object.
var jroInstance = Activator.CreateInstance(jroType);
// Refresh the cache.
jroType.InvokeMember(
@"RefreshCache",
BindingFlags.InvokeMethod,
null,
jroInstance,
new[]
{
adodbInstance
});
}
finally
{
// Close the connection.
adodbType.InvokeMember(
@"Close",
BindingFlags.InvokeMethod,
null,
adodbInstance,
new object[]
{
});
}
}我在我的整个应用程序中使用了OleDB,就在上面的函数中,我使用了这个"ADODB“的东西。
64位应用程序
在64位C#应用程序中,我目前确实不知道有什么方法可以做到这一点。
https://stackoverflow.com/questions/11242945
复制相似问题