Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Ошибка драйвера? Или руки? (число прочтений - 4264 )
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Ошибка драйвера? Или руки?
12. Сентября 2006 :: 13:19
Печать  
У меня постоянно бывает проблема с получением результатов запроса от 1. txt файла 2. Sybase.
Например, почему то периодически получаю 0.28999999999 вместо 0.29
Причем, если попытаюсь сделать ROUND(Поле, 2) все равно выдает такой результат...


Не понимаю куда грешить, на драйвера, или на 1cpp...
Никто не сталкивался?

В запросе ничего криминального:
[code]
DB = СоздатьОбъект("ODBCDatabase");
DB.Соединение("Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" + КаталогВременныхФайлов());
RS = СоздатьОбъект("ODBCRecordSet");
RS.SetDatabase(DB);

ТекстЗапроса = "
     |SELECT *
     |FROM [data.txt]
     |";
ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса, , 1);
ТЗ.ВыбратьСтроку();
[/code]
  
Наверх
 
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка драйвера? Или руки?
Ответ #1 - 12. Сентября 2006 :: 14:09
Печать  
сталкивался с таким при работе с объектом ADODB меня убеждали, чтоо 1С++ но по ряду вопросов возникающих как на этом форуме, так и на "итленде" прихожу к выводу, что 1С++ юзает таки ADODB...
Если это так, то это специфика драйвера. По каждому драйверу можно почитать на MSDN...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Ошибка драйвера? Или руки?
Ответ #2 - 12. Сентября 2006 :: 16:07
Печать  
Цитата:
прихожу к выводу, что 1С++ юзает таки ADODB...
это не так
  

1&&2&&3
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка драйвера? Или руки?
Ответ #3 - 12. Сентября 2006 :: 16:16
Печать  
trad писал(а) 12. Сентября 2006 :: 16:07:
Цитата:
прихожу к выводу, что 1С++ юзает таки ADODB...
это не так

так же подписываюсь под этими словами - это не так Улыбка
  
Наверх
ICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка драйвера? Или руки?
Ответ #4 - 12. Сентября 2006 :: 17:08
Печать  
Причина найдена, это некоректное поведение драйверов при переводе строки '2,9' в число (когда разделителем разрядов является запятая).

Возник другой вопрос, какая функция в простейшем T-SQL делает реплэйс? Улыбка
REPLACE не сработал, ругается. Перепробовал все возможные слова и сочетания, не работает Улыбка

Напомню, это запрос к текстовому файлу с разделителями.
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Ошибка драйвера? Или руки?
Ответ #5 - 12. Сентября 2006 :: 17:16
Печать  
Это проиcходит из-за цепи таких преобразований данных:
число_в_формате_хранилища_данных -> double -> число_в_формате_хранения_1CV7
Первое преобразование делает драйвер ODBC, второе ODBCRecordset. Потеря точности может происходить как при первом так и при втором преобразовании.

Теоретическая справка.
Надо также отметить, что такая потеря точности это нормальное поведение для float чисел (стандартном формате хранения чисел с плавающей точкой) (double - это float двойной точности (8 байт)). Собственно с точки зрения этих чисел никакой потери точности не происходит.
Альтернативой хранения является формат numeric (decimal). Этот формат без потери точности.

Справка по ODBC.
Возможность работы с форматом numeric в ODBC появилась начиная с версии 3.0.


Указанные драйвера скорее всего для ODBC 2.5.
Для решения проблемы нужно избавиться от типа double.
  
Наверх
ICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка драйвера? Или руки?
Ответ #6 - 12. Сентября 2006 :: 17:51
Печать  
Благодарю... очень исчерпывающе.

Остается вопрос, как для текстового файла с форматом данных избавиться от double Подмигивание
Код
Выбрать все
2,9;Траляля;Опа;8; 



Тут то я и сел в лужу...
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Ошибка драйвера? Или руки?
Ответ #7 - 12. Сентября 2006 :: 17:55
Печать  
А если получать как строку?
  
Наверх
ICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка драйвера? Или руки?
Ответ #8 - 12. Сентября 2006 :: 21:04
Печать  
Дык поэтому и спрашивал, как сделать replace прямо в запросе.
Разделитель запятая, хотелось бы сделать что-то вроде SELECT REPLACE(некое_поле, ',' , '.') AS [$Число]
Так, итишкин корень, поддержки реплэйса оказывается нет в этом упрощенном T-SQL.


Ну доломаю как-ни то...
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать