Регистрация Забыли пароль?
Логин
Пароль
Запомнить меня
Вход через ВКонтакте
Главная > Статьи > Как подключиться к Oracle в режиме SYSDBA с Qt

Как подключиться к Oracle в режиме SYSDBA с Qt

Прежде всего, Qt 5 була випущена перед новым годом в качестве подарка :).

Но к сожалению если вы хотите использовать Qt в качестве клиента к базе данных Oracle, и вам необходимо подключаться к БД, как SYSDBA, вам нужно внести некоторые изменения в драйвер OCI.

Идея проста - добавить опцию подключения, которая позволит подключаться как SYSDBA. В файле qsql_oci.cpp вы можете найти 2 строки каторые выглядят как OCISessionBegin (,,,, OCI_DEFAULT); последний параметр отвечает за режим соединения (SYSDBA, SYSOPER, NORMAL и т.д.).

Так що мы просто добавим необходимый параметр в struct QOCIDriverPrivate. Сначала добавьте поле в структуре QOCIDriverPrivate, и не забудьте иницыализировать его, после добавьте код, который получает параметр и устанавливает необходимый режим в static void qParseOpts(const QString &options, QOCIDriverPrivate *d).


static void qParseOpts(const QString &options, QOCIDriverPrivate *d)

{

    const QStringList opts(options.split(QLatin1Char(';'), QString::SkipEmptyParts));

    for (int i = 0; i < opts.count(); ++i) {

        const QString tmp(opts.at(i));

        int idx;

        if ((idx = tmp.indexOf(QLatin1Char('='))) == -1) {

            qWarning("QOCIDriver::parseArgs: Invalid parameter: '%s'",

                     tmp.toLocal8Bit().constData());

            continue;

        }

        const QString opt = tmp.left(idx);

        const QString val = tmp.mid(idx + 1).simplified();

        bool ok;

        if (opt == QLatin1String("OCI_ATTR_PREFETCH_ROWS")) {

            d->prefetchRows = val.toInt(&ok);

            if (!ok)

                d->prefetchRows = -1;

        } else if (opt == QLatin1String("OCI_ATTR_PREFETCH_MEMORY")) {

            d->prefetchMem = val.toInt(&ok);

            if (!ok)

                d->prefetchMem = -1;

        // OUR NEW PARAMETER       

        } else if (opt == QLatin1String("OCI_ATTR_CONNECTION_MODE")) {

            if (val == QLatin1String("SYSDBA")) {

              d->ConnectionMode = OCI_SYSDBA;

            } else if (val == QLatin1String("SYSOPER")) {

              d->ConnectionMode = OCI_SYSOPER;

            } else {

              d->ConnectionMode = OCI_DEFAULT;

            }

        } else {

            qWarning ("QOCIDriver::parseArgs: Invalid parameter: '%s'",

                      opt.toLocal8Bit().constData());

        }

    }

}

Теперь мы можем использовать наш дравер с нивым параметром OCI_ATTR_CONNECTION_MODE


void frmMain::openConnection() {

    OraConnect.setDatabaseName(CurrDatabase);

    switch(CurrMode) {

        case OCI_LOG_MODE_SYSDBA:

            OraConnect.setConnectOptions("OCI_ATTR_CONNECTION_MODE=SYSDBA");

            break;

        case OCI_LOG_MODE_SYSOPER:

            OraConnect.setConnectOptions("OCI_ATTR_CONNECTION_MODE=SYSOPER");

        break;

    }

    if (OraConnect.open(CurrLogin, CurrPass)) {

        LastError.clear();

        return true;

    } else {

        LastError = OraConnect.lastError().databaseText() + "\nDriver message: " +

                OraConnect.lastError().driverText();

        return false;

    }

}

Все необходимые файлы можно скачать тут qsql_oci.zip
Вы можете добавить коментарий на етой странице или на странице форума тут.Постов 2.

Последний комментарий

01.10.2014
please check following line from example
OraConnect.setConnectOptions("OCI_ATTR_CONNECTION_MODE=SYSDBA");
also sent via email
24.09.2014
Hi, could you tell me how to use this new parameter in QSqlDatabase class? Thank you very much. Could you send me the method to my email?

Имя*E-mail
Код*