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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: SQLite - select возвращает пустую таблицу, а это не так !  (Прочитано 21230 раз)
-QT-
Гость
« Ответ #15 : Декабрь 04, 2008, 15:09 »

тогда прикладывай компилябельный проект - сообща победим Улыбающийся
Кстати !
Попутно выяснилось что в селектах параметры работают только числовые, если передаешь
число - селект срабатывает.
тескт - селект возвращает пустоту.
А если вообще без параметров то муть какаятовообще - одни выдают результат другие нет.
Записан
spirit
Гость
« Ответ #16 : Декабрь 04, 2008, 15:13 »

попробуй передавать в bindValue/addBindValue QVariant.
Записан
-QT-
Гость
« Ответ #17 : Декабрь 04, 2008, 15:21 »

C QVariant не прокатило.
Вообщем нах это все - перепишу я этот блок заново.
Но кажется мне что все повториться заново.

Если будут предположения попробую их реализовать.
Записан
spirit
Гость
« Ответ #18 : Декабрь 04, 2008, 15:24 »

я пример постил раньше, че с ним тоже не пашет?
если нет, выложи структуру базы.
Записан
ритт
Гость
« Ответ #19 : Декабрь 04, 2008, 15:24 »

а что выдает такой запрос?
Цитировать
SELECT * FROM p_tovar
пусто.
query.size() = -1

QSQLITE не поддерживает QuerySize (как и NamedPlaceholders, кстати) - поэтому тебе правильно -1 и возвращается.
кури QSqlDriver::hasFeature

зы. QSqlQuery query(sql, QSqlDatabase::database()) сразу выполнит запрос. надеюсь, ты не кзекаешь его тут же повторно...
Записан
-QT-
Гость
« Ответ #20 : Декабрь 04, 2008, 15:45 »

а что выдает такой запрос?
Цитировать
SELECT * FROM p_tovar
пусто.
query.size() = -1

QSQLITE не поддерживает QuerySize (как и NamedPlaceholders, кстати) - поэтому тебе правильно -1 и возвращается.
кури QSqlDriver::hasFeature

зы. QSqlQuery query(sql, QSqlDatabase::database()) сразу выполнит запрос. надеюсь, ты не кзекаешь его тут же повторно...
За наводку по сайзу - спасибо. Вот только я не нашел где это написано...
QSqlQuery query(sql, QSqlDatabase::database()) - выполняется без екзека потом Улыбающийся
Записан
-QT-
Гость
« Ответ #21 : Декабрь 04, 2008, 15:52 »

напиши простенькое тестовое приложение с реальными параметрами, т.е. жестко задай имя базы, драйвер и т.д. и глянь результат.
что-то типа такого
Код
C++ (Qt)
...
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("mydatabase");
if (!db.open())
   return;
QSqlQuery query;
query.prepare("SELECT id, checknumber FROM p_tovar WHERE p_tovar.schkod = ?");
query.addBindValue(myValue);
if (!query.exec())
   return;
...
 

Структура:

Код:
CREATE TABLE "p_tovar" (
    "id" INTEGER PRIMARY KEY NOT NULL,
    "schkod" TEXT,
    "artikul" TEXT,
    "name" TEXT,
    "ves" REAL,
    "edizm" TEXT,
    "valedizm" REAL,
    "cena" REAL,
    "dtsale" TEXT,
    "sumsale" REAL,
    "checknumber" TEXT,
    "taxcode" INTEGER);

"checknumber" TEXT, - это было когда я пробовал в начале
сейчас я его поменял на интежер.
Записан
-QT-
Гость
« Ответ #22 : Декабрь 04, 2008, 16:02 »

Re: Константин
Цитировать
QSQLITE не поддерживает QuerySize (как и NamedPlaceholders, кстати) - поэтому тебе правильно -1 и возвращается.
кури QSqlDriver::hasFeature
А как же тогда отслеживать что селект вернул не пустую таблицу ?
Записан
spirit
Гость
« Ответ #23 : Декабрь 04, 2008, 16:14 »

в общем не знаю, что ты делаешь, но все работает
Код
C++ (Qt)
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("mydatabase");
if (!db.open())
return -1;
 
QString textQuery = "CREATE TABLE p_tovar ("
"id INTEGER PRIMARY KEY NOT NULL,"
"schkod TEXT,"
"artikul TEXT,"
"name TEXT,"
"ves REAL,"
"edizm TEXT,"
"valedizm REAL,"
"cena REAL,"
"dtsale TEXT,"
"sumsale REAL,"
"checknumber TEXT,"
"taxcode INTEGER)";
 
QSqlQuery query(textQuery);
qDebug() << query.exec();
 
qDebug() << query.exec("INSERT INTO p_tovar VALUES (1, 'schkod1', 'artikul1', 'name1', 1.1, 'edizm1', 1.2, 1.3, 'dtsale1', 1.4, 'checknumber1', 1.5)");
qDebug() << query.exec("INSERT INTO p_tovar VALUES (2, 'schkod2', 'artikul2', 'name2', 2.1, 'edizm2', 2.2, 2.3, 'dtsale2', 2.4, 'checknumber2', 2.5)");
qDebug() << query.exec("INSERT INTO p_tovar VALUES (3, 'schkod3', 'artikul3', 'name3', 3.1, 'edizm3', 3.2, 3.3, 'dtsale3', 3.4, 'checknumber3', 3.5)");
 
query.prepare("SELECT id, checknumber FROM p_tovar WHERE p_tovar.schkod = ?");
query.addBindValue("schkod2");
if (!query.exec())
return -1;
 
while (query.next()) {
qDebug() << query.value(0).toString();
qDebug() << query.value(1).toString();
}
 
результат:
Цитировать
true
true
true
true
"2" //то что надо
"checknumber2" //то что надо
Записан
ритт
Гость
« Ответ #24 : Декабрь 04, 2008, 21:15 »

Re: Константин
Цитировать
QSQLITE не поддерживает QuerySize (как и NamedPlaceholders, кстати) - поэтому тебе правильно -1 и возвращается.
кури QSqlDriver::hasFeature
А как же тогда отслеживать что селект вернул не пустую таблицу ?

никак. только двигаясь next()'ами до достижения вранья Улыбающийся
Записан
-QT-
Гость
« Ответ #25 : Декабрь 05, 2008, 09:27 »

Блок переписал заново, изменил структуру базы данных.
Все заработало с одной поправкой:

Код
C++ (Qt)
1       query.prepare("SELECT id, checknumber FROM p_tovar WHERE p_tovar.schkod = ?");
2       query.addBindValue("schkod2");
3       if (!query.exec())
4               return -1;
 
Так вот - если в строке 2 в параметре стоит "строка" то работает нормально, а если переменная
типа QString lsValue = "строка", то возвращает пустой набор данных.
Победить эту проблемму пока не удалось, пробую различные варианты конвертации в QVariant но
безрезультатно.
Записан
spirit
Гость
« Ответ #26 : Декабрь 05, 2008, 09:38 »

опять таки повторюсь
Код
C++ (Qt)
qDebug() << query.exec("INSERT INTO p_tovar VALUES (1, 'schkod1', 'artikul1', 'name1', 1.1, 'edizm1', 1.2, 1.3, 'dtsale1', 1.4, 'checknumber1', 1.5)");
qDebug() << query.exec("INSERT INTO p_tovar VALUES (2, 'schkod2', 'artikul2', 'name2', 2.1, 'edizm2', 2.2, 2.3, 'dtsale2', 2.4, 'checknumber2', 2.5)");
qDebug() << query.exec("INSERT INTO p_tovar VALUES (3, 'schkod3', 'artikul3', 'name3', 3.1, 'edizm3', 3.2, 3.3, 'dtsale3', 3.4, 'checknumber3', 3.5)");
 
query.prepare("SELECT id, checknumber FROM p_tovar WHERE p_tovar.schkod = ?");
QString value = "schkod2";
query.addBindValue(value);
if (!query.exec())
return -1;
 
while (query.next()) {
qDebug() << query.value(0).toString();
qDebug() << query.value(1).toString();
}
 
работает!  Улыбающийся
что за версия кьюти?
Записан
-QT-
Гость
« Ответ #27 : Декабрь 05, 2008, 09:46 »

QT 4.4.3

Код
C++ (Qt)
void MainWindowImpl::selectTovar(const QString &value)
{
   QSqlQuery scanQuery(QSqlDatabase::database());
   scanQuery.prepare("SELECT id, checknumber FROM p_tovar WHERE p_tovar.schkod = ?");
   scanQuery.addBindValue(value);
   if (!scanQuery.exec())
   {
       QApplication::beep();
       QMessageBox::critical(this, QObject::tr("SQL Error"), scanQuery.lastError().text());
       return;
   }
...
}
Не работает !!!
Код
C++ (Qt)
void MainWindowImpl::selectTovar(const QString &value)
{
   QSqlQuery scanQuery(QSqlDatabase::database());
   scanQuery.prepare("SELECT id, checknumber FROM p_tovar WHERE p_tovar.schkod = ?");
   scanQuery.addBindValue("2900000113");
   if (!scanQuery.exec())
   {
       QApplication::beep();
       QMessageBox::critical(this, QObject::tr("SQL Error"), scanQuery.lastError().text());
       return;
   }
...
}
Работает ...
Записан
spirit
Гость
« Ответ #28 : Декабрь 05, 2008, 09:49 »

выложи пример компилябельный.
и файл базы приклепи.
« Последнее редактирование: Декабрь 05, 2008, 09:51 от spirit » Записан
-QT-
Гость
« Ответ #29 : Декабрь 05, 2008, 13:25 »

Всем спасибо за столь бурное участие в решении моей проблемы.
В общем дело я так понимаю было не в бобине  Веселый Смеющийся
Железяка в порт скидывала строку и один непечатаемый символ в конце из 0х00 - 0х0F
Ща идет борьба с железом  - если победы не будет подпилим софт.
 Веселый Веселый
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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