9

我一直在OleDbConnection努力争取让它不缓存。基本上我正在访问一个共享 Access 数据库,该数据库正在从另一个应用程序写入,然后我正在读回值(检查它是否通过 Last Write time 和随后的 1 秒延迟刷新)。

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

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

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

除此之外,连接字符串使用 禁用连接池OLE DB Services = -2。最后,我还在PageTimeoutJet 4.0 的注册表中更改为“10”。

不幸的是,所有这些措施都没有效果。现在我唯一能想到的就是这篇 Microsoft 知识库文章中提到的内容,然后调用JRO.JetEngine.RefreshCache. 唯一的问题是它的论点是一个ADODB.Connection. 我宁愿不重写我的整个数据库层以及我的软件正在读取记录以使用旧 COM 对象只是为了拥有此功能,但它似乎很可能是唯一的方法。

我的问题是,虽然目前正在进行重写以使用 ADODB(甚至不是 ADO.NET!)的任务,是否可以禁用缓存OleDbConnection

4

3 回答 3

1

最后,我找到了一个解决方法:使用 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
}

一切正常。

于 2019-01-08T04:28:45.817 回答
0

您可能有一些运气将“;Jet OLEDB:Flush Transaction Timeout”属性设置为 0 或某个较低的数字。

请参阅文档

于 2014-10-07T14:28:02.090 回答
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# 应用程序中,我目前不知道这样做的方法。

于 2019-09-27T04:58:32.173 回答