Russian Qt Forum

Qt => Базы данных => Тема начата: Пантер от Октябрь 01, 2007, 18:08



Название: Проблема с переходом от SQlite к Firebird
Отправлено: Пантер от Октябрь 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. Что не так?


Название: Re: Проблема с переходом от SQlite к Firebird
Отправлено: Вячеслав от Октябрь 01, 2007, 19:38
Ну таки чего ты от него хочешь ? Запрос выполнен без ошибок и все хорошо ;) А число записей count(*)
и читать чего вернет ;) А вообще - IBE умеет создавать для таблицы(в птице) процедурку вида insert_or_update ;)


Название: Re: Проблема с переходом от SQlite к Firebird
Отправлено: Пантер от Октябрь 01, 2007, 19:41
Ну таки чего ты от него хочешь ? Запрос выполнен без ошибок и все хорошо ;) А число записей count(*)
и читать чего вернет ;) А вообще - IBE умеет создавать для таблицы(в птице) процедурку вида insert_or_update ;)
Не знал. А как пользоваться ентой функцией?


Название: Re: Проблема с переходом от SQlite к Firebird
Отправлено: Вячеслав от Октябрь 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(?, ?,?)");
И далее по тексту ;)


Название: Re: Проблема с переходом от SQlite к Firebird
Отправлено: Пантер от Октябрь 03, 2007, 11:18
Спасибо. Вообще помогла проверка не exec(), а next(). :)
Но за советы огромное спасибо, буду внедрять.


Название: Re: Проблема с переходом от SQlite к Firebird
Отправлено: Вячеслав от Октябрь 03, 2007, 14:44
вообщето IMHO это несколько не верно (next) проверять - если тебе данные на клиенте ненужны - зачем их гонять ?