Версия для печати темы
Форум на CrossPlatform.RU _ Qt Разработка баз данных _ Проблема с подстановкой в запрос SELECT даты (MS SQL).
Автор: silver47 12.4.2010, 5:24
Доброго времени суток, с толкнулся со следующей проблемой, при выполнении запроса, необходимо учитывать границы дат, в последствии нужно будет добавлять записи с нужной датой, думаю там будет то же самое .
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
Из ассистента:
Цитата
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
Цитата(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
Цитата(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
Цитата(silver47 @ 12.4.2010, 9:26)
У меня не оракл, а Microsoft SQL Server 2005.
Зато драйвер QODBC.
Автор: silver47 12.4.2010, 10:55
попробуй для начала заменить подстоновочные значения конкретными данными, и закоментируй 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
Оно так и не должно собираться. Либо используй
searchQuery.bindValue(0, startDate->date());
searchQuery.bindValue(1, stopDate->date());
либо
searchQuery.addBindValue(startDate->date());
searchQuery.addBindValue(stopDate->date());
Я использую второй вариант.
Автор: silver47 12.4.2010, 11:28
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
Цитата(silver47 @ 12.4.2010, 15:28)
Ну в общем понятно, спасибо, буду в текст самого запроса вставлять строку с текстом, содержащую дату. Не красиво, зато работает
попробуй вариант про который я говорил (приведение типа)
Автор: Ay49Mihas 17.6.2010, 5:59
Я делаю так в таких же условиях:
bindValue(":value", startDate->date().toString("yyyyMMdd"));
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)