Russian Qt Forum
Ноябрь 23, 2024, 22:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Связь бд с приложением  (Прочитано 8021 раз)
Виктор
Гость
« : Март 16, 2012, 15:47 »

Подскажите пожалуйста.есть БД firebird,изменить нельзя.При изменении в БД, выдает сообщение через postevent в триггере.Как поймать корректно и обработать event.никак не пойму.
Записан
V1KT0P
Гость
« Ответ #1 : Март 16, 2012, 16:09 »

Подскажите пожалуйста.есть БД firebird,изменить нельзя.При изменении в БД, выдает сообщение через postevent в триггере.Как поймать корректно и обработать event.никак не пойму.
Я с Firebird общаюсь через IBPP и никаких проблем. Говорят что БД часть Qt сделана кривовато.
Записан
QuAzI
Гость
« Ответ #2 : Март 16, 2012, 16:43 »

Случайно не в курсе, в QFirebird дожали что-нить в плане триггерных эвентов, создания БД и прочие вещи доступные через IBPP ? Хочется работать сразу с разными СУБД (через выбор драйвера), но IBPP же не предоставит свой драйвер в список без обвязки.
Записан
Igore
Гость
« Ответ #3 : Март 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
Записан
Виктор
Гость
« Ответ #4 : Март 16, 2012, 18:31 »

БД трогать не могу,а IBPP на сайте только для сервера.Если есть рабочая ссылка для клиента,то скиньте пожалуйста.
Записан
V1KT0P
Гость
« Ответ #5 : Март 16, 2012, 18:40 »

БД трогать не могу,а IBPP на сайте только для сервера.Если есть рабочая ссылка для клиента,то скиньте пожалуйста.
В смысле для сервера?
Записан
Виктор
Гость
« Ответ #6 : Март 16, 2012, 18:53 »

IBPP, a C++ API for Firebird Server Web Site
Записан
Виктор
Гость
« Ответ #7 : Март 16, 2012, 18:54 »

не совсем корректно выразился
Записан
Виктор
Гость
« Ответ #8 : Март 16, 2012, 22:41 »

какие функции необходимо использовать из ibpp
Записан
V1KT0P
Гость
« Ответ #9 : Март 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;
   }
}
Записан
Виктор
Гость
« Ответ #10 : Март 17, 2012, 10:14 »

рассмотрел tests.cpp(test8) из ibpp:EventsFactory(),Add(),Drop(),Commit()-можете объяснить точное использование этих функций(чтобы не гадать).StatementFactory()-как понимаю работает с триггером бд.
Записан
V1KT0P
Гость
« Ответ #11 : Март 17, 2012, 16:00 »

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

спасибо за ссылку.изучаю.
Записан
Виктор
Гость
« Ответ #13 : Март 18, 2012, 10:27 »

набрел на статью http://palien.narod.ru/Documents/DB/IBApiBook/page0083.htm
Записан
Виктор
Гость
« Ответ #14 : Март 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 '&' ?
что делаю не так?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.156 секунд. Запросов: 21.