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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: query.value возвращает пустые поля при различных типах.  (Прочитано 3950 раз)
igorskir
Гость
« : Март 19, 2013, 19:56 »

Добрый день.
Я извлекаю данные из excel(2003) таблицы, используя драйвер ODBC.
Предположим, что формат таблицы следующий (пусть она будет состоять из одного столбца Title) :

Title     
A13     
16         

И так, данные выборки полученной запросом SELECT можно извлечь командой
Код:
query.value(index)
Пробегая по каждому столбцу в цикле (у нас он всего 1), а затем переходя на следующую строку методом .next (я не буду описывать весь механизм).
Результат, который возвращает query.value представлен типом QVariant и как сказано в статье 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
Спасибо.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Март 19, 2013, 21:06 »

Проверяли через QVariant::isNull(), QVariant::isValid() ?
Смотрели тип Type QVariant::type() ?
Плюс еще можно было "принудительно" преобразовывать через QVariant::to...() к нужному типу
Записан

igorskir
Гость
« Ответ #2 : Март 20, 2013, 08:36 »

Проверяли через QVariant::isNull(), QVariant::isValid() ?
Смотрели тип Type QVariant::type() ?
Плюс еще можно было "принудительно" преобразовывать через QVariant::to...() к нужному типу

Подобного рода проверки ни к чему не приводят. Принудительное преобразование типов просто преобразует 0 в QString. И соответственно наоборот. QVariant::type() возвращает конечный тип, либо double либо QString, причем тип всегда один и тот же, в не зависимости какие данные приходят на вход. Определяется он по первым входящим данным.
Записан
dio
Гость
« Ответ #3 : Март 20, 2013, 11:29 »

Попробуйте в select'е преобразовать значение поля к текстовому типу.
Код:
SELECT CStr([Title]) FROM [sheet1$]
Записан
igorskir
Гость
« Ответ #4 : Март 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 без каких-либо потерь.
Тема закрыта.
Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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