禁用/刷新 OleDbConnection 缓存



我已经和OleDbConnection斗争了一段时间,试图让它不缓存。基本上,我正在访问从另一个应用程序写入的共享 Access 数据库,然后我正在读回值(已检查它是否通过上次写入时间和随后的 1 秒延迟刷新)。

不幸的是,这是完全不可靠的。

我一直在阅读(并且发疯了)如何禁用连接池,随后在每次可能的更新后,在重新连接之前执行以下操作:

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

除此之外,连接字符串还会禁用具有 OLE DB Services = -2 的连接池。最后,我还在 Jet 4.0 的注册表中将PageTimeout更改为"10"。

不幸的是,所有这些措施都没有产生任何效果。现在我唯一能想到做的就是这篇Microsoft知识库文章中提到的内容,并调用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
}

一切正常。

您可能有一些运气设置";Jet OLEDB:刷新事务超时"属性为 0 或某个较低的数字。

请参阅文档。

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# 应用程序中,我目前不知道如何做到这一点

相关内容

  • 没有找到相关文章

最新更新