Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Разработка баз данных _ Неправильный запрос к SQLite

Автор: tumanovalex 24.10.2010, 21:59

Создана таблица в базе:

CREATE TABLE [Date] (
[dateid] INTEGER  NOT NULL PRIMARY KEY AUTOINCREMENT,
[date] Date  UNIQUE NOT NULL
)

В таблицу записаны данные (смотрел SQLite Admin)
dateid    date
1    15.10.2010
2    16.10.2010
3    19.10.2010
4    21.10.2010

Данные записывались из QDateEdit запросом:
query.prepare("INSERT INTO Date(date) VALUES(?)");
query.addBindValue(ui->dtAdd->date());
if(!query.exec()) {
   QMessageBox::warning(this, "Error", "Unable to insert date");
}

При записи данных из формы я проверяю, записана ли выбранная дата (в моем случае 21.10.2010) из QDateEdit в базу:
QSqlQuery query;
query.prepare("SELECT date FROM Date WHERE date = VALUES(?)");
query.addBindValue(ui->dtAdd->date());
if(!query.exec()) {
   qDebug() << query.lastError().text();
    return;
}

Получаю сообщение: "Parameter count mismatch".
Хотелось бы получить ответы на следующие вопросы:
1. Как можно посмотреть полный текст запроса (после addBindValue). Я поставил точку останова до if(!query.exec()), но выделить текст запроса не смог.
2. Почему мой запрос с проверкой даты выполняется неправильно и как правильно написать запрос, в котором в качестве параметра используется значение QDateEdit?
Не нашел возможности на форуме внедрить свой проект, разместил его на http://zalil.ru/29849040.


 MyDB_______.zip ( 6.67 килобайт ) : 113
 

Автор: Litkevich Yuriy 25.10.2010, 2:59

Цитата(tumanovalex @ 25.10.2010, 0:59) *
1. Как можно посмотреть полный текст запроса (после addBindValue)
если СУБД сама поддерживает подстановку, то никак. Если не поддерживает, то поможет метод http://doc.crossplatform.ru/qt/4.6.x/qsqlquery.html#executedQuery

Цитата(tumanovalex @ 25.10.2010, 0:59) *
SELECT date FROM Date WHERE date = VALUES(?)
этого ключевого слова в SELECT'е быть не должно

http://www.sqlite.org/lang_select.html

Автор: tumanovalex 25.10.2010, 7:35

Спасибо за ответ. Передел:

      QString qr, dt;
      qr = "SELECT date FROM Date WHERE date = ";
      dt = ui->dtAdd->date().toString("yyyy-MM-dd");
      qr = qr + dt; //     if(!query.exec("SELECT date FROM Date WHERE date = '2010-10-25'")) {
     if(!query.exec(qr)) {
       QMessageBox::warning(this, "Error", "Date not is writed in the base");
       qDebug() << query.lastError();
       return;
     }
     query.first();
     qDebug() << query.next();
     qDebug() << query.value(0);

Получаю сообщение:
false
QSqlQuery::value: not positioned on a valid record
QVariant(, )
Прикрепляю новый вариант проекта

 MyBD.zip ( 6.8 килобайт ) : 101
 

Автор: Litkevich Yuriy 25.10.2010, 9:38

Цитата(tumanovalex @ 25.10.2010, 10:35) *
yyyy-MM-dd
а дату в правильном формате указываешь?

И почему решил отказаться от подстановки значений? Заменил бы только VALUES(?), на ? и всё

Автор: tumanovalex 25.10.2010, 22:18

1. Так тоже не получилось:

      QSqlQuery query;
      query.prepare("SELECT date FROM Date WHERE date = ?");
      query.addBindValue(ui->dtAdd->date());
      if(!query.exec(qr)) {
       QMessageBox::warning(this, "Error", "Date not is writed in the base");
       qDebug() << query.lastError();
       return;
      }

получаю окно сообщения, а qDebug() выдает:
QSqlQuery::exec: empty query
QSqlError(-1, "", "")
2. Запрос SELECT date FROM Date WHERE date = '2010-10-21' проверял в SQLite Admin, запрос выполнился правильно.

Автор: ufna 25.10.2010, 22:36

добавь ' ' к ?, т.к. счас у тебя идет без апострофов запрос

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)