crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Тема закрытаНачать новую тему
> Неправильный запрос к SQLite
tumanovalex
  опции профиля:
сообщение 24.10.2010, 21:59
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 24
Регистрация: 6.8.2008
Пользователь №: 253

Спасибо сказали: 0 раз(а)




Репутация:   0  


Создана таблица в базе:
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 килобайт ) Кол-во скачиваний: 124
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 25.10.2010, 2:59
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(tumanovalex @ 25.10.2010, 0:59) *
1. Как можно посмотреть полный текст запроса (после addBindValue)
если СУБД сама поддерживает подстановку, то никак. Если не поддерживает, то поможет метод QString QSqlQuery::executedQuery () const

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

Справка
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
tumanovalex
  опции профиля:
сообщение 25.10.2010, 7:35
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 24
Регистрация: 6.8.2008
Пользователь №: 253

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо за ответ. Передел:
      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 килобайт ) Кол-во скачиваний: 115
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 25.10.2010, 9:38
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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

И почему решил отказаться от подстановки значений? Заменил бы только VALUES(?), на ? и всё
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
tumanovalex
  опции профиля:
сообщение 25.10.2010, 22:18
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 24
Регистрация: 6.8.2008
Пользователь №: 253

Спасибо сказали: 0 раз(а)




Репутация:   0  


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
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

Спасибо сказали: 29 раз(а)




Репутация:   5  


добавь ' ' к ?, т.к. счас у тебя идет без апострофов запрос
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Тема закрытаНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 30.12.2024, 21:23