首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用/刷新OleDbConnection缓存

禁用/刷新OleDbConnection缓存
EN

Stack Overflow用户
提问于 2012-06-28 18:45:20
回答 3查看 2.7K关注 0票数 9

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

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

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

代码语言:javascript
复制
_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的缓存

EN

回答 3

Stack Overflow用户

发布于 2019-01-08 12:28:46

最后,我找到了一个解决办法:用OdbcConnection代替OleDbConnection。

这是旧的代码:

代码语言:javascript
复制
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
}

这是一个新的:

代码语言:javascript
复制
string mdbConnectionString = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=" + mdbFile;
using (OdbcConnection conn = new OdbcConnection(mdbConnectionString)) {
    conn.Open();
    //Do your query
}

所有的工作都很好。

票数 1
EN

Stack Overflow用户

发布于 2014-10-07 22:28:02

您可能会幸运地将";Jet OLEDB:Flush Transaction Timeout“属性设置为0或某个较小的数字。

See documentation

票数 0
EN

Stack Overflow用户

发布于 2019-09-27 12:58:32

32位应用程序

在32位C#应用程序中,我多年来一直在这样做以刷新缓存:

代码语言:javascript
复制
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#应用程序中,我目前确实不知道有什么方法可以做到这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11242945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档