Russian Qt Forum

Qt => Базы данных => Тема начата: michael_ky от Декабрь 02, 2011, 00:39



Название: Oracle 11g + instant client(не выполняются sql запросы)
Отправлено: michael_ky от Декабрь 02, 2011, 00:39
К сожалению, являюсь абсолютным новичком в области баз данных и, возможно, не с того начинаю, но попробовал написать пару строчек(большей частью примеры из шлее) для работы с oracle.
Код:
int main (int argc, char ** argv)
{
    QCoreApplication app(argc, argv);
    app.addLibraryPath("C:\Instant_client");;

    QSqlDatabase base = QSqlDatabase::addDatabase("QOCI");

    base.setDatabaseName("XE");
    base.setUserName("michael");
    base.setHostName("192.168.0.100");
    base.setPassword("password");

    if(!base.open()) qDebug() << "Cannot connect oracle!\n";
    else qDebug() << "Connected!\n";

    QSqlQuery query(base);
    QString ins_str = "SELECT * FROM addressbook;";
    //query.prepare(ins_str);
    if(query.exec(ins_str)) qDebug() << "Successful SELECT!\n";
    else qDebug() << "Failed SELECT!\n";

    QSqlRecord rec = query.record();
    int cell;
    QString name;

    while(query.next())
    {
        cell = query.value(rec.indexOf("cell")).toInt();
        name = query.value(rec.indexOf("name")).toString();

        qDebug() << cell << " " << name << "\n";
    }

    qDebug() << base.lastError();
    return 0;
}

Имею oracle 11g express, также instant client. Qoci подключился. К базе вроде как подключен, но селект не выполняется, впрочем как и create table. lastError() ошибок не выдал. Явно делаю какую-то ерунду, но не могу понять где.
Через sqlplus command line создал таблицу с двумя полями, забил её парой значений, закомитил и хотел бы вывести в qt. Своему логину выдал необходимые права.
Если возможно хотелось бы услышать как я должен поступить по порядку, включая самые элементарные вещи.
Ну и пара глупых вопросов:
Достаточно ли просто создать подключение как в коде для работы с парой таблиц? Или необходимо открывать что-то дополнительно?
При создании таблиц с sql command line oracle они автоматически сохраняются на жестком диске?
Когда установил сервер бд, то практически ничего не задавал, listener и tnsnames сгенерированы автоматически, мне нужно добавлять свои сервисы и указывать, например, global_bdname? Или я могу пользоваться теми, что по умолчанию?
Надеюсь на помощь. Спасибо.


Название: Re: QSqlQuery и несколько базовых вопросов
Отправлено: kowsan от Декабрь 02, 2011, 06:54
Все должно работать.
Единственное, что меня смущает
Код:
 app.addLibraryPath("C:\Instant_client");
замени на

Код:
 app.addLibraryPath("C:/Instant_client");
Ну и я бы немного по-другому написал твой код.
В частности
Код:
QString ins_str = "SELECT * FROM addressbook;";
select * плохой тон.


Название: Re: QSqlQuery и несколько базовых вопросов
Отправлено: michael_ky от Декабрь 02, 2011, 15:18
с базой соединен, сделать ничего не могу. В чем проблема?
Кто-нибудь использует instant client?(и как кстати узнать используется он или нет?)


Название: Re: Oracle 11g + instant client(не выполняются sql запросы)
Отправлено: michael_ky от Декабрь 02, 2011, 17:29
ну, оперный театр... проверился qsqlquery::isValid() оказалось ";" была перебором. я уж .ora перекапывать хотел)


Название: Re: Oracle 11g + instant client(не выполняются sql запросы)
Отправлено: MoPDoBoPoT от Декабрь 02, 2011, 19:59
оказалось ";" была перебором
Ну да, оракл защищается от возможных sql-инъекций (чтобы нельзя было несколько операторов выполнить).


Название: Re: Oracle 11g + instant client(не выполняются sql запросы)
Отправлено: michael_ky от Декабрь 03, 2011, 15:52
Таблицы выводит,всё изумительно.
Только после того как прикрутил интерфейс, пропали все драйвера из списка доступных. Это с чем может быть связано?