Как добавить меры предосторожности, чтобы обойти Microsoft.ACE.OLEDB.12.0 не зарегистрировано? - PullRequest
0 голосов
/ 03 февраля 2020

Когда я использую следующий код на своем домашнем компьютере, он прекрасно работает для меня. Тем не менее, я должен использовать его на нескольких разных машинах.

"Provider = Microsoft.ACE.OLEDB.12.0;"

Я думал, что это можно обойти, потому что он мне нужен в более универсальном формате, чтобы он работал на нескольких машинах.

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

Он будет изменен на Microsoft.Jet.OLEDB.4.0

Если кто-нибудь может немного поцарапать код, чтобы обойти это, чтобы моя программа могла взять учитывать оба провайдера, это было бы здорово, так как это сделало бы мои проекты более универсальными.

Фоновый код (игнорируйте небезопасные SQL, если вы не хотите это исправить):

    OleDbDataReader^ openData(String^ fieldEntity, String^ field, String^ tableName)
    {
        String^ sqlstr = "SELECT * FROM ";
        sqlstr += tableName + " WHERE " + field + " = " + fieldEntity; 
        OleDbConnection^ conn = nullptr;
        conn = gcnew OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;" +
            "Data Source =" + "myDatabaseV3.accdb");
        OleDbCommand^ cmd = nullptr;

        //fix this so that it will consider both providers.
        conn->Open();
        cmd = gcnew OleDbCommand(sqlstr, conn);
        OleDbDataReader^ reader = cmd->ExecuteReader(System::Data::CommandBehavior::CloseConnection); 
        return reader;
    }

1 Ответ

0 голосов
/ 04 февраля 2020

Я решил эту проблему сам. Я понял, что могу еще раз попытаться использовать в своем классе оператор catch для изменения строки подключения, если есть исключение

    conn = gcnew OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0;" +
        "Data Source =" + "myDatabaseV3.mdb");
    pause();
    OleDbCommand^ cmd = nullptr;

    //fix this so that it will come out of the current directiory 
    try {
        conn->Open();
    }
    catch (Exception^ ex)
    {
        conn->ConnectionString = "Provider = Microsoft.ACE.OLEDB.12.0;" +
            "Data Source =" + "myDatabaseV3.accdb";
        conn->Open();
    }

Вы можете переключать их, если хотите, чтобы порядок этих значений не имел значения. Кроме того, если это решение недопустимо, вы можете использовать вложенный оператор try catch. Тем не менее, мой код, в частности, имеет этот класс In, и способ его запуска в любом случае заключается в попытке перехвата другой части кода, поэтому он мне не нужен.

...