|
Вопрос # 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
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|