| 
| 
 | Вопрос # 4 723/ вопрос открыт / | 
 |  Здравствуйте, уважаемые эксперты!
 Разъясните такую проблему:
 идет выборка из MS SQL (не важно 2000 или 2005) нескольких полей в числе которых присутствует тип BigInt (это тип в MS SQL)
 результат выборки в ADOQuery -> DataSource.
 А значение поля с типом BigInt отопражается в DBMemo.
 Почему при этом теряется знак (-), т.е. все значения с типом bigInt отображаются как положительные, со всеми вытекающими последствиями. Что это? Ошибка Delphi, или я чего-то не учитываю
 (в самом SQL, естественно, все нормально работает, т .е результат аналогичного запроса в Management Studio прекрасно работает и выдает правильные значения)
 
|  |   Вопрос задал: Mike (статус: Посетитель)Вопрос отправлен: 12 ноября 2010, 10:51
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 5; последнее сообщение — 13 ноября 2010, 17:27; участников в обсуждении: 3. 
|   | Vic (статус: 1-ый класс), 12 ноября 2010, 17:18 [#1]:Ни разу не использовал BigInt но Вы меня заинтриговали
 попробовал
 все корректно отображается
 у Вас глюк видно где - то
 |  
|   | Мережников Андрей (статус: Абитуриент), 12 ноября 2010, 20:07 [#2]:зачем BigInt отображать в Memo? |  
|   | 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 (статус: Посетитель), 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 (статус: 1-ый класс), 13 ноября 2010, 17:27 [#5]:на семерке не проверял, а вот в Delphi2007
 все корректно работает
 тип поля в ADOQuery - ftLargeint
 попробуй вместо ADOQeury ADODataSet
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |