Russian Qt Forum

Qt => Базы данных => Тема начата: pokidoff от Май 19, 2011, 10:14



Название: Oracle Разделитель целой и дробной части
Отправлено: pokidoff от Май 19, 2011, 10:14
В базе хранятся вещественные числа. В системных настройках разделитель точка. При выборке из базы столбцы с вещественными числами имеют тип QVariant::String и имеют в качестве разделителя запятую. Что нужно сделать, чтобы выборка шла в соответствии с локалью?


Oracle 11.2, Qt 4.7.0, WinXP Pro


Название: Re: Oracle Разделитель целой и дробной части
Отправлено: GreatSnake от Май 19, 2011, 10:42
Цитировать
При выборке из базы столбцы с вещественными числами имеют тип QVariant::String
А почему не QVariant::Double?
Цитировать
Что нужно сделать, чтобы выборка шла в соответствии с локалью?
Так с локалью или с настройками оракла?


Название: Re: Oracle Разделитель целой и дробной части
Отправлено: pokidoff от Май 19, 2011, 10:50
Цитировать
Цитировать
При выборке из базы столбцы с вещественными числами имеют тип QVariant::String
А почему не QVariant::Double?
Я и сам хотел бы это знать. Скорее всего из-за запятой, т.к. невозможно перевести в double
Цитировать
Цитировать
Что нужно сделать, чтобы выборка шла в соответствии с локалью?
Так с локалью или с настройками оракла?
Хоть с чем-нибудь.


Название: Re: Oracle Разделитель целой и дробной части
Отправлено: pokidoff от Май 19, 2011, 11:00
Решил
Код
C++ (Qt)
query.exec("ALTER SESSION SET NLS_NUMERIC_CHARACTERS = \".,\"");


Название: Re: Oracle Разделитель целой и дробной части
Отправлено: MoPDoBoPoT от Май 19, 2011, 22:53
Цитировать
Цитировать
При выборке из базы столбцы с вещественными числами имеют тип QVariant::String
А почему не QVariant::Double?
Я и сам хотел бы это знать. Скорее всего из-за запятой, т.к. невозможно перевести в double
Потому что в БД могут храниться числа с большей точностью. Читать про QSql::NumericalPrecisionPolicy


Название: Re: Oracle Разделитель целой и дробной части
Отправлено: GreatSnake от Май 20, 2011, 09:44
Цитировать
Потому что в БД могут храниться числа с большей точностью. Читать про QSql::NumericalPrecisionPolicy
А могут и не храниться. И что значит все числа будем хранить как строки? Бред...

PS: упс, погорячился, упустил что 'QSql::HighPrecision - The default behavior'.


Название: Re: Oracle Разделитель целой и дробной части
Отправлено: pokidoff от Май 20, 2011, 10:01
У меня в проге стоит
Код
C++ (Qt)
db.setNumericalPrecisionPolicy(QSql::HighPrecision);
И все равно колонки типа NUMBER(5,2) в QT попадают как QVariant:String

А вот пример, работающий при любых системных настройках
Код
C++ (Qt)
   QSqlQuery query(db);
   QChar delimiter = QLocale::system().decimalPoint();
   QString qs = "ALTER SESSION SET NLS_NUMERIC_CHARACTERS = \"%1\"";
   qs = (delimiter == '.' ? qs.arg(".,") : qs.arg(",."));
   query.exec(qs);
 


Название: Re: Oracle Разделитель целой и дробной части
Отправлено: GreatSnake от Май 20, 2011, 10:06
У меня в проге стоит
Код
C++ (Qt)
db.setNumericalPrecisionPolicy(QSql::HighPrecision);
И все равно колонки типа NUMBER(5,2) в QT попадают как QVariant:String
Ну и зачем тогда тебе HighPrecision? Используй QSql::LowPrecisionDouble для таких чисел.


Название: Re: Oracle Разделитель целой и дробной части
Отправлено: pokidoff от Май 20, 2011, 15:26
Код:
The default behavior is to bind these values as a QString.
QSql::HighPrecision The default behavior - try to preserve maximum precision.
Да, тупанул. Спасибо.