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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с переходом от SQlite к Firebird  (Прочитано 5553 раз)
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« : Октябрь 01, 2007, 18:08 »

Р Жизнь заставила сделать такой переход. Структуру таблиц сделал вручную, теперь требуется импортировать данные. Причем общий переход пока не планирую и нужно периодически подгружать данные из SQlite базы. Код такой:
Код:
QSqlDatabase qsdBase_sqlite = QSqlDatabase::addDatabase("QSQLITE","lite");
qsdBase_sqlite.setDatabaseName(qsBaseName);

QSqlDatabase qsdBase_ibase= QSqlDatabase::addDatabase("QIBASE","ibase");
qsdBase_ibase.setHostName("avtomat");
qsdBase_ibase.setUserName("USER");
qsdBase_ibase.setPassword("password");
qsdBase_ibase.setDatabaseName("REFERENCEASP");

QSqlQuery* qsqReadQuery=new QSqlQuery(qsdBase_sqlite);
QSqlQuery* qsqWriteQuery=new QSqlQuery(qsdBase_ibase);

qsqReadQuery->exec("SELECT COUNT(ID) FROM reftbl");
qsqReadQuery->first();
int iCount=qsqReadQuery->value(0).toInt();
qsqReadQuery->exec("SELECT * FROM reftbl");
if (!qsqReadQuery->isActive())
{
QMessageBox::critical(0, QCoreApplication::applicationName(),qsqReadQuery->lastError().text());
return 0;
}
QProgressDialog* qpdProgress=new QProgressDialog("Loading...", "Cancel", 0, iCount);
qpdProgress->setWindowModality(Qt::WindowModal);
while (qsqReadQuery->next())
{
qpdProgress->setValue(qpdProgress->value()+1);
qsqWriteQuery->prepare(QString("SELECT * FROM REFTBL WHERE ID=")+qsqReadQuery->value(0).toString());
bool bResult=qsqWriteQuery->exec();
if (bResult)
qsqWriteQuery->prepare("UPDATE REFTBL SET NUMBERDELO=:NUMBERDELO,FAMIL=:FAMIL,NAME=:NAME,OTCH=:OTCH,REFTYPE=:REFTYPE,UID=:UID,REFDATE=:REFDATE,REFTEXT=:REFTEXT WHERE ID=:ID");
else
qsqWriteQuery->prepare("INSERT INTO REFTBL (ID,NUMBERDELO,FAMIL,NAME,OTCH,REFTYPE,UID,REFDATE,REFTEXT) VALUES (:ID,:NUMBERDELO,:FAMIL,:NAME,:OTCH,:REFTYPE,:UID,:REFDATE,:REFTEXT)");
qsqWriteQuery->bindValue(":ID",qsqReadQuery->value(0));
qsqWriteQuery->bindValue(":NUMBERDELO",qsqReadQuery->value(1));
qsqWriteQuery->bindValue(":FAMIL",qsqReadQuery->value(2));
qsqWriteQuery->bindValue(":NAME",qsqReadQuery->value(3));
qsqWriteQuery->bindValue(":OTCH",qsqReadQuery->value(4));
qsqWriteQuery->bindValue(":REFTYPE",qsqReadQuery->value(5));
qsqWriteQuery->bindValue(":UID",qsqReadQuery->value(6));
qsqWriteQuery->bindValue(":REFDATE",qsqReadQuery->value(7).toDateTime());
qsqWriteQuery->bindValue(":REFTEXT",qsqReadQuery->value(8).toString().toUtf8());
if (!qsqWriteQuery->exec())
{
QMessageBox::critical(0, QCoreApplication::applicationName(),qsqWriteQuery->lastError().text());
return 0;
}
}
Проблемное в том, что bResult всегда true. Что не так?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Вячеслав
Гость
« Ответ #1 : Октябрь 01, 2007, 19:38 »

Ну таки чего ты от него хочешь ? Запрос выполнен без ошибок и все хорошо Подмигивающий А число записей count(*)
и читать чего вернет Подмигивающий А вообще - IBE умеет создавать для таблицы(в птице) процедурку вида insert_or_update Подмигивающий
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Октябрь 01, 2007, 19:41 »

Ну таки чего ты от него хочешь ? Запрос выполнен без ошибок и все хорошо Подмигивающий А число записей count(*)
и читать чего вернет Подмигивающий А вообще - IBE умеет создавать для таблицы(в птице) процедурку вида insert_or_update Подмигивающий
Не знал. А как пользоваться ентой функцией?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Вячеслав
Гость
« Ответ #3 : Октябрь 01, 2007, 21:56 »

Ну таки чего ты от него хочешь ? Запрос выполнен без ошибок и все хорошо Подмигивающий А число записей count(*)
и читать чего вернет Подмигивающий А вообще - IBE умеет создавать для таблицы(в птице) процедурку вида insert_or_update Подмигивающий
Не знал. А как пользоваться ентой функцией?
count ? в запросе рисуешь select count(*) from Далее-по-тексту .Данный агрегат возвращает количество записей в выборке.
а процедурой - в ibe в меню таблицы ввбираем "Create procedures" ставим галку insert /update и получаем нечто вроде
Цитировать
create procedure building_iu (
  id integer,
  street_ref integer,
  name varchar(32))
as
begin
  if (exists(select  from building where )) then
    update building
    set id = :id,
        street_ref = :street_ref,
        name = :name
    where ;
  else
    insert into building (
        id,
        street_ref,
        name)
    values (
        :id,
        :street_ref,
        :name);
end
Далее соответственно 
Цитировать
query.prepare("CALL building_iu(?, ?,?)");
И далее по тексту Подмигивающий
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Октябрь 03, 2007, 11:18 »

Спасибо. Вообще помогла проверка не exec(), а next(). Улыбающийся
Но за советы огромное спасибо, буду внедрять.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Вячеслав
Гость
« Ответ #5 : Октябрь 03, 2007, 14:44 »

вообщето IMHO это несколько не верно (next) проверять - если тебе данные на клиенте ненужны - зачем их гонять ?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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