Название: 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 без поддержки юникода". Вот только как...может кто-то подскажет? |