crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Проблема с подстановкой в запрос SELECT даты (MS SQL).
silver47
  опции профиля:
сообщение 12.4.2010, 5:24
Сообщение #1


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

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

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




Репутация:   6  


Доброго времени суток, с толкнулся со следующей проблемой, при выполнении запроса, необходимо учитывать границы дат, в последствии нужно будет добавлять записи с нужной датой, думаю там будет то же самое :(.


QSqlQuery searchQuery;
QString q("SELECT dbo.violations.SSNO, dbo.DEPT.NAME, ... FROM dbo.violations INNER JOIN dbo.DEPT ON (dbo.violations.DEPT_ID = dbo.DEPT.ID) WHERE ");

q += "(dbo.violations.DOCDATE >= :start) and (dbo.violations.DOCDATE <= :stop)";
searchQuery.bindValue(":start", startDate->date());
searchQuery.bindValue(":stop", stopDate->date());


при выполнении запроса: QODBCResult::exec: unable to bind variable: " [Microsoft][ODBC SQL Server Driver]Дополнительная возможность не реализована"

:(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
molchanoviv
  опции профиля:
сообщение 12.4.2010, 8:19
Сообщение #2


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

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




Репутация:   5  


Из ассистента:

Цитата
Oracle databases identify placeholders by using a colon-name syntax, e.g :name. ODBC simply uses ? characters. Qt supports both syntaxes, with the restriction that you can't mix them in the same query.


Попробуй перестроить запрос на использование "запроса без параметров".
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 12.4.2010, 8:26
Сообщение #3


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

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

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




Репутация:   6  


Цитата(molchanoviv @ 12.4.2010, 11:19) *
Из ассистента:

Цитата
Oracle databases identify placeholders by using a colon-name syntax, e.g :name. ODBC simply uses ? characters. Qt supports both syntaxes, with the restriction that you can't mix them in the same query.


Попробуй перестроить запрос на использование запроса без параметров.

У меня не оракл, а Microsoft SQL Server 2005. Как перестроить? конвертить дату в текст?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.4.2010, 8:39
Сообщение #4


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

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

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




Репутация:   94  


Цитата(silver47 @ 12.4.2010, 12:26) *
У меня не оракл, а Microsoft SQL Server 2005.
тебе цитату привели не спроста, прочитай её всю
Цитата(silver47 @ 12.4.2010, 12:26) *
Как перестроить? конвертить дату в текст?
попробуй для начала заменить подстоновочные значения конкретными данными, и закоментируй bindValue
Просто, чтобы проверить сам запрос.

Если всё в порядке, то используй вопросики (позиционную подстановку)

вообще я думаю, что дата должна в каком-то конкретном виде в запрос подставлятся. Например как строка. А у тебя она напрямую помещается.
Может быть нужно что-то вроде этого:
CAST (':startstamp' AS TIMESTAMP)


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
molchanoviv
  опции профиля:
сообщение 12.4.2010, 8:43
Сообщение #5


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

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




Репутация:   5  


Цитата(silver47 @ 12.4.2010, 9:26) *
У меня не оракл, а Microsoft SQL Server 2005.


Зато драйвер QODBC.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 12.4.2010, 10:55
Сообщение #6


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

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

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




Репутация:   6  


попробуй для начала заменить подстоновочные значения конкретными данными, и закоментируй bindValue
Просто, чтобы проверить сам запрос.


попробовал, запрос верный.

Позиционнная подстановка:

QString q("SELECT ..... всякое безобразие ");

q += "(dbo.violations.DOCDATE >= '?') and (dbo.violations.DOCDATE <= '?')";
q += " ORDER BY dbo.violations.DOCDATE DESC";
searchQuery.prepare(q);
searchQuery.bindValue(startDate->date());
searchQuery.bindValue(stopDate->date());


Ошибка при компиляции widget.cpp:343: error: no matching function for call to 'QSqlQuery::bindValue(QDate)'

Зачем создаю промежуточную строку с текстом запроса? Запрос динамический, начало у него одинаковое, а вот WHERE меняются там на условиях.

Ну чтож, если не получиться с позиционной, никто не помешает мне непосредственно в текст запроса втыкать дату, хотя и не красиво и коряво будет :(


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
molchanoviv
  опции профиля:
сообщение 12.4.2010, 11:01
Сообщение #7


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

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




Репутация:   5  


Оно так и не должно собираться. Либо используй
searchQuery.bindValue(0, startDate->date());
searchQuery.bindValue(1, stopDate->date());

либо
searchQuery.addBindValue(startDate->date());
searchQuery.addBindValue(stopDate->date());

Я использую второй вариант.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 12.4.2010, 11:28
Сообщение #8


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

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

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




Репутация:   6  


searchQuery.addBindValue(startDate->date());
searchQuery.addBindValue(stopDate->date());


QODBCResult::exec: unable to bind variable: " [Microsoft][ODBC SQL Server Driver]Дополнительная возможность не реализована"

searchQuery.bindValue(0, startDate->date());
searchQuery.bindValue(1, stopDate->date());


QODBCResult::exec: unable to bind variable: " [Microsoft][ODBC SQL Server Driver]Дополнительная возможность не реализована"

Ну в общем понятно, спасибо, буду в текст самого запроса вставлять строку с текстом, содержащую дату. Не красиво, зато работает :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.4.2010, 13:34
Сообщение #9


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

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

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




Репутация:   94  


Цитата(silver47 @ 12.4.2010, 15:28) *
Ну в общем понятно, спасибо, буду в текст самого запроса вставлять строку с текстом, содержащую дату. Не красиво, зато работает
попробуй вариант про который я говорил (приведение типа)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Ay49Mihas
  опции профиля:
сообщение 17.6.2010, 5:59
Сообщение #10


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 17.6.2010
Пользователь №: 1814

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




Репутация:   0  


Я делаю так в таких же условиях:

bindValue(":value", startDate->date().toString("yyyyMMdd"));
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 4.6.2020, 6:51