Russian Qt Forum

Qt => Базы данных => Тема начата: Виктор от Март 16, 2012, 15:47



Название: Связь бд с приложением
Отправлено: Виктор от Март 16, 2012, 15:47
Подскажите пожалуйста.есть БД firebird,изменить нельзя.При изменении в БД, выдает сообщение через postevent в триггере.Как поймать корректно и обработать event.никак не пойму.


Название: Re: Связь бд с приложением
Отправлено: V1KT0P от Март 16, 2012, 16:09
Подскажите пожалуйста.есть БД firebird,изменить нельзя.При изменении в БД, выдает сообщение через postevent в триггере.Как поймать корректно и обработать event.никак не пойму.
Я с Firebird общаюсь через IBPP и никаких проблем. Говорят что БД часть Qt сделана кривовато.


Название: Re: Связь бд с приложением
Отправлено: QuAzI от Март 16, 2012, 16:43
Случайно не в курсе, в QFirebird дожали что-нить в плане триггерных эвентов, создания БД и прочие вещи доступные через IBPP ? Хочется работать сразу с разными СУБД (через выбор драйвера), но IBPP же не предоставит свой драйвер в список без обвязки.


Название: Re: Связь бд с приложением
Отправлено: Igore от Март 16, 2012, 16:55
Я в postgresql в триггере делаю NOTIFY, а в Qt ловлю через
Код:
    if (database_.open())
    {
        if (!database_.driver()->subscribeToNotification("TEST"))
        {
        }
        else
        {
        }
        connect(database_.driver(), SIGNAL(notification(QString)), SLOT(_onNotification(QString)));
    }
Попробуй через QSqlDriver::notification


Название: Re: Связь бд с приложением
Отправлено: Виктор от Март 16, 2012, 18:31
БД трогать не могу,а IBPP на сайте только для сервера.Если есть рабочая ссылка для клиента,то скиньте пожалуйста.


Название: Re: Связь бд с приложением
Отправлено: V1KT0P от Март 16, 2012, 18:40
БД трогать не могу,а IBPP на сайте только для сервера.Если есть рабочая ссылка для клиента,то скиньте пожалуйста.
В смысле для сервера?


Название: Re: Связь бд с приложением
Отправлено: Виктор от Март 16, 2012, 18:53
IBPP, a C++ API for Firebird Server Web Site


Название: Re: Связь бд с приложением
Отправлено: Виктор от Март 16, 2012, 18:54
не совсем корректно выразился


Название: Re: Связь бд с приложением
Отправлено: Виктор от Март 16, 2012, 22:41
какие функции необходимо использовать из ibpp


Название: Re: Связь бд с приложением
Отправлено: V1KT0P от Март 17, 2012, 00:40
какие функции необходимо использовать из ibpp
Примерно вот так:
Код
C++ (Qt)
IBPP::Database m_db;
 
void connectDB()
{
   try {
       m_db = IBPP::DatabaseFactory(m_host.toStdString(), m_name.toStdString(), m_user.toStdString(), m_password.toStdString());
       m_db->Connect();
   } catch (IBPP::Exception &e) {
   }
}
 
bool executeQuery(QString *query)
{
   try {
       IBPP::Transaction tr = IBPP::TransactionFactory(m_db);
       tr->Start();
       IBPP::Statement st = IBPP::StatementFactory(m_db, tr);
       try {
           st->Prepare(query->toStdString());
           st->Execute();
           tr->Commit();
           return true;
       } catch(IBPP::Exception &e) {
           tr->Rollback();
           throw;
       }
   } catch(IBPP::Exception &e) {
       return false;
   }
}


Название: Re: Связь бд с приложением
Отправлено: Виктор от Март 17, 2012, 10:14
рассмотрел tests.cpp(test8) из ibpp:EventsFactory(),Add(),Drop(),Commit()-можете объяснить точное использование этих функций(чтобы не гадать).StatementFactory()-как понимаю работает с триггером бд.


Название: Re: Связь бд с приложением
Отправлено: V1KT0P от Март 17, 2012, 16:00
рассмотрел tests.cpp(test8) из ibpp:EventsFactory(),Add(),Drop(),Commit()-можете объяснить точное использование этих функций(чтобы не гадать).StatementFactory()-как понимаю работает с триггером бд.
Я использую только чтение и запись в базу. Если нужна справка по функциям то смотри документацию: http://www.ibpp.org/reference (http://www.ibpp.org/reference).


Название: Re: Связь бд с приложением
Отправлено: Виктор от Март 17, 2012, 16:22
спасибо за ссылку.изучаю.


Название: Re: Связь бд с приложением
Отправлено: Виктор от Март 18, 2012, 10:27
набрел на статью http://palien.narod.ru/Documents/DB/IBApiBook/page0083.htm


Название: Re: Связь бд с приложением
Отправлено: Виктор от Март 18, 2012, 10:57
решил воспользоваться этой статьей и получилось:

    isc_db_handle db_handle = 0L ;
    ISC_UCHAR *event_buffer, *result_buffer;
    ISC_STATUS status_vector[20];
    short length;
    ISC_LONG event_id;
    int i, counter;
    int event_flag;
    char * result, updated;
    short dpb_buf_len=20;
    char dpb_buf[]={
                 isc_dpb_version1,                //версия буфера
                 isc_dpb_user_name,                //начинается кластер параметра имя пользователя
                 6,                                //длина этого параметра 6 байт
                 'S','Y','S','D','B','A',                //строка имени пользователя
                 isc_dpb_password,                //начинается кластер пароля пользователя
                 9,                                //длина его 9 байт
                 'm','a','s','t','e','r','k','e','y'        //сам пароль
                   };
    char setDatabaseName[] = "D:/???.gdb";

    isc_attach_database(status_vector,strlen(setDatabaseName),setDatabaseName,&db_handle,dpb_buf_len,dpb_buf);
    if (status_vector[0] == 1 && status_vector[1])
    {
    isc_print_status(status_vector); /* Display error message. */
    return(1);
    };
    length = (short)isc_event_block(&event_buffer, &result_buffer, 1,"TRAIN_PLAN_UPDT");
    isc_que_events(status_vector,&db_handle,&event_id,length,event_buffer,(ISC_EVENT_CALLBACK)event_function,result_buffer);
    if (status_vector[0] == 1 && status_vector[1])
    {
    isc_print_status(status_vector); /* Display error message. */
    return(1);
        };

на  isc_que_events возникает следующая ошибка : did you forget the '&' ?
что делаю не так?