Russian Qt Forum

Qt => Базы данных => Тема начата: -QT- от Декабрь 04, 2008, 13:06



Название: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: -QT- от Декабрь 04, 2008, 13:06
Доброго времени суток, All.

Вот такая конструкция:
Код:
	
QSqlQuery query(QSqlDatabase::database());
query.prepare("SELECT id, checknumber FROM 'p_tovar' WHERE 'p_tovar'.'schkod' = :schkod");
query.bindValue(":schkod", value);
if(!query.exec())
{
        QApplication::beep();
QMessageBox::critical(this, QObject::tr("SQL Error"), query.lastError().text());
return;
}

Делал так: "SELECT * FROM 'p_tovar' "
И через параметр и б...я, как только не извращался  >:( нифига не работает.
Хотя в другой программе все пашет.  ???
И это только селекты, апдейты и инсерты работают нормально.

У кого какие мысли по этому поводу?


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: lit-uriy от Декабрь 04, 2008, 13:09
а если списо таблиц вывести,  твоя таблица в списке будет?
(может это из-за одиночных кавычек)


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: -QT- от Декабрь 04, 2008, 13:12
а если списо таблиц вывести,  твоя таблица в списке будет?
(может это из-за одиночных кавычек)
Что имелось в виду ?
Если через коммандную строку то все таблицы видны.
Код:
sqlite> .tables
p_check  p_kamen  p_tovar
sqlite>       
И запрос выполняется правильно, возвращает нужную запись:
Код:
sqlite> SELECT id, checknumber FROM 'p_tovar' WHERE 'p_tovar'.'schkod' = '2900000113';
1|
Если в программе, то ошибки что отсутствует таблица нет, если поставить другое имя таблицы в запросе
ругается что такой таблицы нет.


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: spirit от Декабрь 04, 2008, 13:22
попробуй запрос переписать вот так
Цитировать
"SELECT id, checknumber FROM p_tovar WHERE p_tovar.schkod = :schkod"


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: -QT- от Декабрь 04, 2008, 14:09
попробуй запрос переписать вот так
Цитировать
"SELECT id, checknumber FROM p_tovar WHERE p_tovar.schkod = :schkod"
Результат тот-же.
Даже пробовал так:
Код:
QString sql(QString("SELECT id, checknumber FROM p_tovar WHERE p_tovar.schkod = %1").arg(value));
QSqlQuery query(sql, QSqlDatabase::database());
ничего не выходит... сцука б...л п...ла на...


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: spirit от Декабрь 04, 2008, 14:13
а что выдает такой запрос?
Цитировать
SELECT * FROM p_tovar


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: -QT- от Декабрь 04, 2008, 14:18
а что выдает такой запрос?
Цитировать
SELECT * FROM p_tovar
пусто.
query.size() = -1


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: spirit от Декабрь 04, 2008, 14:20
вопрос конечно идиотский, а база-то открыта?  :)


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: -QT- от Декабрь 04, 2008, 14:26
вопрос конечно идиотский, а база-то открыта?  :)

 
Код:
   QSqlDatabase db = QSqlDatabase::addDatabase( ParameterSQL.DriverName );
    db.setDatabaseName( ParameterSQL.DatabaseName );
    if (ParameterSQL.DriverName != "QSQLITE")
    {
        db.setHostName( ParameterSQL.HostName );
        db.setPort( ParameterSQL.PortNumber );
        db.setUserName( ParameterSQL.UserName );
        if ( ParameterSQL.SavePasword )
            db.setPassword( ParameterSQL.Password );
    }

    if ( !db.open() )
    {
        listBrowseMessage(QString::fromUtf8("Не удалось подключиться к локальной базе данных."));
    }
    if (db.isValid())
MainWindowImpl::showTableWidget();
    else
qDebug() << TEXTLOGING << "db.isValid = " << db.isValid();
ни каких сообщений или ошибок не выдается.
Если убрать файл базы данных то ругается (Не удалось подключиться к локальной базе данных.)


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: spirit от Декабрь 04, 2008, 14:28
а в sqlbrowser'e запросы к этой табле обрабатываются?
ps.sqlbrowser кьютишный экзампл в папке demos/sqlbrowser.


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: -QT- от Декабрь 04, 2008, 14:31
а в sqlbrowser'e запросы к этой табле обрабатываются?
ps.sqlbrowser кьютишный экзампл в папке demos/sqlbrowser.
да все работает и показывает заголовки таблицы и записи.

Я же писал выше - что в других прогах работает все.


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: spirit от Декабрь 04, 2008, 14:34
напиши простенькое тестовое приложение с реальными параметрами, т.е. жестко задай имя базы, драйвер и т.д. и глянь результат.
что-то типа такого
Код
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;
...
 


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: ритт от Декабрь 04, 2008, 14:35
похоже, что-то у тебя накосячено...

зы. вместо if (ParameterSQL.DriverName != "QSQLITE") лучше бы if (db.driverName() != "QSQLITE")


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: -QT- от Декабрь 04, 2008, 14:38
напиши простенькое тестовое приложение с реальными параметрами, т.е. жестко задай имя базы, драйвер и т.д. и глянь результат.
Те же яйца - вид сбоку! Нифига нет.


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: ритт от Декабрь 04, 2008, 15:08
тогда прикладывай компилябельный проект - сообща победим :)


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: -QT- от Декабрь 04, 2008, 15:09
тогда прикладывай компилябельный проект - сообща победим :)
Кстати !
Попутно выяснилось что в селектах параметры работают только числовые, если передаешь
число - селект срабатывает.
тескт - селект возвращает пустоту.
А если вообще без параметров то муть какаятовообще - одни выдают результат другие нет.


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: spirit от Декабрь 04, 2008, 15:13
попробуй передавать в bindValue/addBindValue QVariant.


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: -QT- от Декабрь 04, 2008, 15:21
C QVariant не прокатило.
Вообщем нах это все - перепишу я этот блок заново.
Но кажется мне что все повториться заново.

Если будут предположения попробую их реализовать.


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: spirit от Декабрь 04, 2008, 15:24
я пример постил раньше, че с ним тоже не пашет?
если нет, выложи структуру базы.


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: ритт от Декабрь 04, 2008, 15:24
а что выдает такой запрос?
Цитировать
SELECT * FROM p_tovar
пусто.
query.size() = -1

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

зы. QSqlQuery query(sql, QSqlDatabase::database()) сразу выполнит запрос. надеюсь, ты не кзекаешь его тут же повторно...


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: -QT- от Декабрь 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()) - выполняется без екзека потом :)


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: -QT- от Декабрь 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, - это было когда я пробовал в начале
сейчас я его поменял на интежер.


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: -QT- от Декабрь 04, 2008, 16:02
Re: Константин
Цитировать
QSQLITE не поддерживает QuerySize (как и NamedPlaceholders, кстати) - поэтому тебе правильно -1 и возвращается.
кури QSqlDriver::hasFeature
А как же тогда отслеживать что селект вернул не пустую таблицу ?


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: spirit от Декабрь 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" //то что надо


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

никак. только двигаясь next()'ами до достижения вранья :)


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: -QT- от Декабрь 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 но
безрезультатно.


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: spirit от Декабрь 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();
}
 
работает!  :)
что за версия кьюти?


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: -QT- от Декабрь 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;
   }
...
}
Работает ...


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: spirit от Декабрь 05, 2008, 09:49
выложи пример компилябельный.
и файл базы приклепи.


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: -QT- от Декабрь 05, 2008, 13:25
Всем спасибо за столь бурное участие в решении моей проблемы.
В общем дело я так понимаю было не в бобине  :D ;D
Железяка в порт скидывала строку и один непечатаемый символ в конце из 0х00 - 0х0F
Ща идет борьба с железом  - если победы не будет подпилим софт.
 :D :D


Название: Re: SQLite - select возвращает пустую таблицу, а это не так !
Отправлено: Lucky_spirit от Апрель 27, 2012, 12:23
Не сочтите за ПиАр. Вижу, что тема уже старая, но всё же может кому-то поможет моя статья. Просто недавно сам мучался с запросами и в этой теме искал ответ, но сделал немного по-другому. Меньше запросов на SQL, а больше запросов самого Qt - в итоге всё удалось и работает без ошибок. Статья находится здесь: http://cpp-qt.at.ua/news/qt_i_raboty_s_bazami_dannykh_sqlite/2012-04-27-2 (http://cpp-qt.at.ua/news/qt_i_raboty_s_bazami_dannykh_sqlite/2012-04-27-2). Еще раз прошу не принимать, как спам или подобное. Если ссылку нельзя - оставьте её, как текст.