Russian Qt Forum
Октябрь 01, 2024, 18:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Use the CONVERT function to run this query.  (Прочитано 4364 раз)
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."
 и все запрос не проходит.
Может кто то знает в чем тут дело и как решить проблемму?
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #1 : Октябрь 28, 2009, 00:52 »

Цитировать
query.bindValue(":text",text);

Что такое переменная text - это QString ? Вероятно ODBC или сервер БД хочет char * - то есть несовпадает количество байт на символ - когда передается менее 186 символов процедура работает верно? Она правильно принимает переданную строку?
Записан
VozaMFC
Гость
« Ответ #2 : Ноябрь 03, 2009, 10:00 »

Цитировать
Что такое переменная text - это QString ?
верно.
Записан
VozaMFC
Гость
« Ответ #3 : Ноябрь 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 без поддержки юникода". Вот только как...может кто-то подскажет?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.044 секунд. Запросов: 22.