Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 723

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!

Разъясните такую проблему:
идет выборка из MS SQL (не важно 2000 или 2005) нескольких полей в числе которых присутствует тип BigInt (это тип в MS SQL)
результат выборки в ADOQuery -> DataSource.
А значение поля с типом BigInt отопражается в DBMemo.
Почему при этом теряется знак (-), т.е. все значения с типом bigInt отображаются как положительные, со всеми вытекающими последствиями. Что это? Ошибка Delphi, или я чего-то не учитываю
(в самом SQL, естественно, все нормально работает, т .е результат аналогичного запроса в Management Studio прекрасно работает и выдает правильные значения)

Mike Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Mike (статус: Посетитель)
Вопрос отправлен: 12 ноября 2010, 10:51
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 13 ноября 2010, 17:27; участников в обсуждении: 3.
Vic

Vic (статус: 1-ый класс), 12 ноября 2010, 17:18 [#1]:

Ни разу не использовал BigInt
но Вы меня заинтриговали
попробовал
все корректно отображается
у Вас глюк видно где - то
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 12 ноября 2010, 20:07 [#2]:

зачем BigInt отображать в Memo?
Mike

Mike (статус: Посетитель), 13 ноября 2010, 11:07 [#3]:

ну зачем - это уже другой вопрос, не относящийся к делу - так просто было проще объяснить, он не только там отображается... И вообще дело не столько в отображении, сколько в содержании этого значения уже в самом ADOQuery - именно тут происходит обрезание знака (на этапе получения данных из базы). Просто нужно работать с типом BigInt
А у меня не только не отображается, но и если программно пытаться записать Например:
var
bi: Variant;
begin
bi := DataSource1.DataSet.FieldByName('Поле с типом BigInt').asVariant;
в результате в bi заносится число, но положительное
если просто записать bi := -42374912983741 то все нормально, а вот из DataSource1 - уже идет положительное (это видно в отладчике, что положительное число - оно до момента присвоения уже находится в FieldByName('Поле с типом BigInt').asVariant и соответственно в переменную таким и записывается)
Пока обошел это запрашивая из базы поле с типом BigInt с предварительной его конвертацией в строку - тогда все нормально работает. И преобразованное обратно в тип LargeInt (уже внутри Delphi)оно прекрасно записывается как параметр хранимой процедуры (ADOStoredProc) и все выполняется, а вот при считывании в поле TLargeintField (это тип присваиваемый полю ADOQuery содержащего тип BigInt) происходит отсекание знака, ну и далее это значение уже живет как положительное.
P.S.
У меня Delphi 7.0 - может тут загвоздка.
Знаю, что до версии 7.0 включительно у Delphi была проблема с типом TLargeintField (проблема при записи в него типа Variant)
Mike

Mike (статус: Посетитель), 13 ноября 2010, 14:09 [#4]:

Для заинтересовавшихся добавлю:

кидаю на форму ADOConnection; ADOQuery; DataSource;
DBText - для быстрой проверки результата (можно и грид или что еще не важно)
Устанавливаю соединение (определяю ConnectionString) с реальной базой SQL (хотя использовать таблицы из MS SQL не буду для этого примера) - просто для обеспечения работоспособности всей связки в целом.
Самое интересное:
ADOQuery1.Connection := ADOConnection1;
ADOQuery1.SQL.Add('Select -123456789098765 as FNum');
ADOQuery1.open;

в DBText вижу -123456789098765, а если взглянуть на тип поля FNum в ADOQuery, то оно приняло значение TBCDField

ADOQuery1.Connection := ADOConnection1;
ADOQuery1.SQL.Add('Select cast(-123456789098765 as bigint) as FNum');
ADOQuery1.open;

в DBText вижу 123456789098765, а если взглянуть на тип поля FNum в ADOQuery, то оно приняло значение TLargeintField

получается, что при загрузке отриц. значений bigint в ADOQUERY происходит сбой

Вопрос это только у меня (как сказал Vic), или это вообще в Delphi 7.0
Vic

Vic (статус: 1-ый класс), 13 ноября 2010, 17:27 [#5]:

на семерке не проверял,
а вот в Delphi2007
все корректно работает
тип поля в ADOQuery - ftLargeint
попробуй вместо ADOQeury ADODataSet

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:55
Выполнено за 0.03 сек.