Название: query.value возвращает пустые поля при различных типах. Отправлено: igorskir от Март 19, 2013, 19:56 Добрый день.
Я извлекаю данные из excel(2003) таблицы, используя драйвер ODBC. Предположим, что формат таблицы следующий (пусть она будет состоять из одного столбца Title) : Title A13 16 И так, данные выборки полученной запросом SELECT можно извлечь командой Код: query.value(index) Результат, который возвращает query.value представлен типом QVariant и как сказано в статье http://doc.crossplatform.ru/qt/4.6.x/sql-sqlstatements.html (http://doc.crossplatform.ru/qt/4.6.x/sql-sqlstatements.html) : может хранить значения различных типов C++ и ядра Qt, такие как int, QString и QByteArray. Различные типы значений базы данных автоматически приводятся к ближайшему эквиваленту в Qt. Для первой строки QVariant вернет данные типа QString: QVariant(QString, "A13"). Для второй строки QVarint возвращает следующий результат: QVariant(QString, ""). Видимо захардкоривая то, что данный столбец имеет тип данных QString (возможно я не прав). Если поменять кортежи местами результаты будет следующий: QVariant(double, 16) и QVariant(double, 0). Вместо A13 возвращается 0. Таким образом, имея (по мнению QVariant) разнородные данные, мы теряем часть значений, которые заменяются либо пустыми строками, либо нулями. Вопрос, как обойти подобного рода проблему? Работа с типами ячеек непосредственно в excel файле не помогает. P.S. Данная тема обсуждалась когда-то,но решение, так и не было предложено. Ссылка: http://www.cyberforum.ru/qt/thread540380.html (http://www.cyberforum.ru/qt/thread540380.html) Спасибо. Название: Re: query.value возвращает пустые поля при различных типах. Отправлено: gil9red от Март 19, 2013, 21:06 Проверяли через QVariant::isNull(), QVariant::isValid() ?
Смотрели тип Type QVariant::type() ? Плюс еще можно было "принудительно" преобразовывать через QVariant::to...() к нужному типу Название: Re: query.value возвращает пустые поля при различных типах. Отправлено: igorskir от Март 20, 2013, 08:36 Проверяли через QVariant::isNull(), QVariant::isValid() ? Смотрели тип Type QVariant::type() ? Плюс еще можно было "принудительно" преобразовывать через QVariant::to...() к нужному типу Подобного рода проверки ни к чему не приводят. Принудительное преобразование типов просто преобразует 0 в QString. И соответственно наоборот. QVariant::type() возвращает конечный тип, либо double либо QString, причем тип всегда один и тот же, в не зависимости какие данные приходят на вход. Определяется он по первым входящим данным. Название: Re: query.value возвращает пустые поля при различных типах. Отправлено: dio от Март 20, 2013, 11:29 Попробуйте в select'е преобразовать значение поля к текстовому типу.
Код: SELECT CStr([Title]) FROM [sheet1$] Название: Re: query.value возвращает пустые поля при различных типах. Отправлено: igorskir от Март 20, 2013, 13:21 Попробуйте в select'е преобразовать значение поля к текстовому типу. Не помогло. Код: SELECT CStr([Title]) FROM [sheet1$] qDebug(): ****************************************** qGetStringData: Error while fetching data ( "[Microsoft][Драйвер ODBC Excel] Недопустимое использование Null" ) QVariant(QString, "") ****************************************** Проблема решена. Ошибка была в EXCEL Файле. EXCEL не верно делал преобразование типов. Таблица была создана с типом "Общие", когда я в ручную менял тип ячейки, в которой были записаны данные, тип не менялся (сам редактор отображал смену, но внутри XML, описывающих EXLEC документ смены не происходило.) Как только данные были удалены из ячейки, тип ячейки был изменен, и данные помещены обратно, проблема решилась. Да, еще в Параметры->Формулы, необходимо убрать галочку "Числа, отформатированные как текст или.....". После всех манипуляций QVariant возвращает все данные, как QString без каких-либо потерь. Тема закрыта. Спасибо. |