Russian Qt Forum

Qt => Базы данных => Тема начата: VozaMFC от Октябрь 23, 2009, 13:45



Название: Use the CONVERT function to run this query.
Отправлено: VozaMFC от Октябрь 23, 2009, 13:45
Всем привет!

Проблемма след. характера:
приложение написанное с использованием Qt работает из БД Microsoft SQL Server 2000 через ODBC...
вот, и при выполнении такого куска кода:

query.prepare("EXECUTE AddReport :id, :text);
query.bindValue(":id",id);
query.bindValue(":text",text);
bool bRes = query.exec();

AddReport хранимая в БД процедура принимающая в параметри число в виде int и строку в виде varchar(800)
все номально работает если у процедуру AddReport у второй параметр попадает текст в несколько слов,
а вот если строка побольше, в моем случае это было 186 символов то драйвер ODBC
бросает вот такое исключение:

QODBCResult::exec: Unable to execute statement: "  [Microsoft][ODBC SQL Server Driver][SQL Server]Disallowed implicit conversion from data type ntext to data type varchar, table
 'TheDB.dbo.Reports', column 'Report'.
Use the CONVERT function to run this query.
[Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared."
 и все запрос не проходит.
Может кто то знает в чем тут дело и как решить проблемму?


Название: Re: Use the CONVERT function to run this query.
Отправлено: break от Октябрь 28, 2009, 00:52
Цитировать
query.bindValue(":text",text);

Что такое переменная text - это QString ? Вероятно ODBC или сервер БД хочет char * - то есть несовпадает количество байт на символ - когда передается менее 186 символов процедура работает верно? Она правильно принимает переданную строку?


Название: Re: Use the CONVERT function to run this query.
Отправлено: VozaMFC от Ноябрь 03, 2009, 10:00
Цитировать
Что такое переменная text - это QString ?
верно.


Название: Re: Use the CONVERT function to run this query.
Отправлено: VozaMFC от Ноябрь 03, 2009, 10:06
Цитировать
сервер БД хочет char *
выходит что так.
тут описана эта проблемма:
http://qt.nokia.com/developer/task-tracker/index_html?method=entry&id=188675
в примерном переводе звучит так:
"QODBCResult::exec: Unable to execute statement: "  [Microsoft][ODBC SQL Server Driver][SQL Server]Disallowed implicit conversion from data type ntext to data type varchar, table
 'TheTaskDB.dbo.ReportTask', column 'Report'.
Use the CONVERT function to run this query. [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared."

QODBCResult::exec: Unable to execute statement:   [Microsoft][ODBC SQL
Server Driver][SQL Server]недозволенное подразумемое преобразование типа данных ntext в тип varchar, таблица 'tempdb.dbo.#test_000000000746',
column 'two'. Используйте для этого запроса функцию CONVERT. [Microsoft][ODBC SQL Server Driver][SQL Server].
Невозможно подготовить утверждения.

Такая же проблема возникает, когда исполдьзоуется setData внутри модели таблицы,
и модель таблица хочет записать свои данные.

Не фиксит: Класс QString выдает символьную строку в юникоде, а varchar в SQL - не юникод. При вставке QString в поле varchar, строка требует преобразования, но SQL Server 2003 не разрешает подразумеваемые преобразования в некоторых случаях. Существует несколько путей решения проблемы: ивпользуйте nvarchar вместо varchar, используйте явный cast или компилируйте драйвер QODBC без поддержки юникода. Пример явного преобразования (подготовки выражения): "INSERT INTO test VALUES (cast(? as varchar))".
В SQL Server 2005 преобразование производится неявно."

Из этого выходит что лучше всего в даной ситуации воспользоватся советом:"компилируйте драйвер QODBC без поддержки юникода". Вот только как...может кто-то подскажет?