Отключить/очистить кеш OleDbConnection

Я некоторое время боролся с OleDbConnection, пытаясь заставить его не кэшировать. По сути, я обращаюсь к общей базе данных Access, в которую записывается из другого приложения, а затем я считываю значения (проверив, что она сбрасывается через время последней записи и последующую задержку в 1 секунду).

К сожалению, это совершенно ненадежно.

Я читал (и сходил с ума), как отключить пул соединений, и впоследствии, после каждого возможного обновления, перед повторным подключением выполняю следующее:

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

В дополнение к этому строка подключения отключает пул соединений с OLE DB Services = -2. Наконец, я также изменил PageTimeout на «10» в реестре для Jet 4.0.

Все эти меры, к сожалению, не дают никакого эффекта. Теперь единственное, что я могу придумать, это то, что упомянуто в этой статье Microsoft KB, и вызвать JRO.JetEngine.RefreshCache. Единственная проблема в том, что это аргумент ADODB.Connection. Я бы предпочел не переписывать весь уровень моей базы данных и места, где записи считываются моим программным обеспечением, чтобы использовать устаревший COM-объект только для того, чтобы иметь эту функциональность, но, похоже, это может быть единственным способом.

Мой вопрос: в настоящее время выполняется эта задача по переписыванию для использования ADODB (даже не ADO.NET!), Можно ли отключить кэширование OleDbConnection?


person Rudi Visser    schedule 28.06.2012    source источник


Ответы (3)


Наконец, я нашел обходной путь: используйте 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
}

Все работает нормально.

person guogangj    schedule 08.01.2019

Возможно, вам повезет, установив для свойства «; Jet OLEDB: Flush Transaction Timeout» значение 0 или какое-то меньшее число.

см. документацию.

person user4117615    schedule 07.10.2014

32-битное приложение

В 32-битном приложении С# я делаю это годами, чтобы обновить кеш:

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# в настоящее время я не знаю никакого способа сделать это.

person Uwe Keim    schedule 27.09.2019