Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];

Вниз

Длинное целое   Найти похожие ветки 

 
Рамиль   (2003-12-09 10:22) [0]

В БД первичный ключ имеет разрядность 64 бит. Как его вытащить в программу? Если пользоваться BDE то он преобразует его в число с плавающей точкой. ADO пишет BCD overflow. Обращение к полю как Variant тоже ничего не дает. Единственный приемлемый вариант, который я нашел, это преобразовывать число в строку в select функцией СУБД. Может еще как нибудь можно?


 
Digitman   (2003-12-09 10:39) [1]

см. метод TField.GetData()
позволяет "вытащить" данные поля безо всяких преобразований


 
Рамиль   (2003-12-09 11:38) [2]

Такая конструкция дает билеберду
var
vr: PInt64;
begin
new(vr);
Table1.FieldByName("nrec").GetData(vr);
end;

(DataSize возвращает 8)
Это значит надо разобраться как число физически хранится в БД, при этом Locate еще не будет доступно... Я правильно понимаю?


 
Hooch   (2003-12-09 11:49) [3]

ADO ошибку выдает про открытии или при обращению к полю ?


 
Рамиль   (2003-12-09 11:52) [4]

В Gride пишет BCD Overflow, соответственно и при обращении.


 
Hooch   (2003-12-09 11:55) [5]

а попробуй в дизайнере полей указать явно это поле как Largeint


 
Рамиль   (2003-12-09 12:56) [6]


> а попробуй в дизайнере полей указать явно это поле как Largeint

ADOTable1: Type mismatch for field "nrec": excepting LargeInt actual: BCD

вот:(


 
Digitman   (2003-12-09 13:00) [7]

а кто за тебя будет память выделять ? Пушкин ?


 
Рамиль   (2003-12-09 13:14) [8]


> Digitman © (09.12.03 13:00) [7]

А это что?
> new(vr);

Ну поставлю я
vr := AllocMem(8), от этого ничего не изменится.


 
ZrenBy   (2003-12-09 13:15) [9]

А что дает

ADOTable1.UpdateCursorPos;
Panel1.Caption := ADOTable1.Recordset.Fields["nrec"].Value;


 
Digitman   (2003-12-09 13:21) [10]


> А это что?
> > new(vr);


миль пардон, проглядел


> Такая конструкция дает билеберду


подробней про "билеберду"..


 
Reindeer Moss Eater   (2003-12-09 13:23) [11]

Запрети драйверу использовать BCD поля.
Работай c ftFloat полем.


 
Рамиль   (2003-12-09 14:09) [12]


> ADOTable1.UpdateCursorPos;
> Panel1.Caption := ADOTable1.Recordset.Fields["nrec"].Value;

Хм... Это работает.

> подробней про "билеберду"..

При использовании ADO это не работает вообще, пишет не могу преобразовать Decimal в Currency. При использовании BDE вместо 2000000007 возвращает 4746175416023121920, например.

Кстати ошибка возникает также при попытке запуска программы с использованием ADO в IDE, при запуске exe не ругается...

Даже если воспользоваться [9], все равно непонятно как избавиться от появления ошибки в IDE
Вообщем фигня полная...


 
Рамиль   (2003-12-09 14:11) [13]


> Запрети драйверу использовать BCD поля.
> Работай c ftFloat полем.

А как? С остальными полями что делать? Провайдер MSDASQL, свой родной не хочет работать ни в какую.


 
Апач   (2003-12-09 14:14) [14]

а ты не пользовался бетривовскими юнитами PvTables, BtvTables,
там гдето функция есть
DirectBtrCall( , , , , , );
нудно но зато все правильно и быстро


 
Апач   (2003-12-09 14:20) [15]

небось с Галактикой паришся :)))))


 
Digitman   (2003-12-09 14:23) [16]


> При использовании ADO это не работает вообще, пишет не могу
> преобразовать Decimal в Currency


явно сделай такой поле типа ftBytes - никаких попыток неявных преобразований выполняться при этом не должно по идее


 
Рамиль   (2003-12-09 14:24) [17]


> Апач (09.12.03 14:14) [14]

Нет вообщето, их еще скачать надо... Но должно же стандартными методами работать!


 
Апач   (2003-12-09 14:26) [18]

Если хочешь подарим
могу подарить собственные патуги работы с етой функцией
Я скока искал нифига не нашол.... :(


 
Рамиль   (2003-12-09 14:29) [19]


> явно сделай такой поле типа ftBytes - никаких попыток неявных
> преобразований выполняться при этом не должно по идее

То же самое получается, наверное в обратной последовательности байт записано.


> небось с Галактикой паришся :)))))

Догадливый какой;) С ней самой, родимой, будь она не ладна...


 
Рамиль   (2003-12-09 14:35) [20]


> Апач (09.12.03 14:26) [18]

Я уже подумывал напрямую к DLL обращаться. Пришли, plz ;)


 
Апач   (2003-12-09 14:36) [21]

Рамиль да у нас общая беда :)))
щас поищу и вышлю


 
Апач   (2003-12-09 14:42) [22]

ой рамиль он большой :(
высылать небуду
попробуй скачаи с их офицального саита
вышлю тока свои исходники


 
Polevi   (2003-12-09 14:56) [23]

EnableBCD


 
sniknik   (2003-12-09 15:09) [24]

> При использовании ADO это не работает вообще, пишет не могу преобразовать Decimal в Currency.
хз. у меня работает.
подключение

Provider=MSDASQL.1;Persist Security Info=False;Data Source=Pervasvile

делаем
CREATE TABLE Table1 (id integer(2), bigint integer(8))

ложим число
INSERT INTO Table1 (id,bint) VALUES (1, 9223372036854775807)

после читаю, все нормально. правда в гриде (и при чтении типа) как строку его показывает(без преобразований!!! просто select * from Table1)... (в самом битриве нормально большое число)


 
ZrenBy   (2003-12-09 15:15) [25]

>>sniknik © (09.12.03 15:09) [24]
А
INSERT INTO Table1 (id,bint) VALUES (2, -9223372036854775807)


 
sniknik   (2003-12-09 15:20) [26]

ZrenBy © (09.12.03 15:15) [25]
забавно
INSERT INTO Table1 (id,bint) VALUES (3, -9223372036854775808)
в гриде вижу урезанное на 1 символ
-92233720368547758
длинну неправильно обрабатывает (похоже берет длинну только числа, знак не учитывает)


 
Рамиль   (2003-12-09 16:05) [27]


> sniknik © (09.12.03 15:09) [24]

У меня база готовая уже, сам я ничего делать не могу:(
Может у меня из за того что таблицы версии Betrive 7, а в DDF конвертирована Галактикой.

Э... Не понял, у меня на эту инструкцию ругается

> делаем
> CREATE TABLE Table1 (id integer(2), bigint integer(8))
:ODBC Error: SQLSTATE = 37000, Native error code = 0
Syntax Error: CREATE TABLE Table1 (id integer(2), bint bigint integer<< ??? >>(8))
Driver not capable

Создает только так
CREATE TABLE Table1 (id integer, bint bigint)
но в итоге все равно BCD overflow


 
sniknik   (2003-12-09 18:26) [28]

> Создает только так
> CREATE TABLE Table1 (id integer, bint bigint)
;о)) у меня наоборот, на это

EOleException : [Pervasive Software][ODBC Interface][Pervasive Software SQL Engine]The specified data type is invalid

> BCD overflow
у меня нет но вот с минусом... :(( похоже глюк ADO, рекордсет формируется с длиной поля (ActualSize) равной 19, принимает строкой. в случае отрицательного числа один знак на больших числах пропадает. (GetData аналогично режет) :(.
если считать, что
Value Ranges
не
-9223372036854775808 – 9223372036854775807
а
-999999999999999999 – 9223372036854775807
(длинна в строке на знак меньше)
то все замечательно ;о)).

а поддержка BCD включена?
кстати если у тебя пытается к каренси преобразовать то максимально принимаемое значение будет из него см.
Currency
- 922337203685477.5808.. 922337203685477.5807
т.е. попробуй со значениями <= 922337203685477


 
Рамиль   (2003-12-09 19:41) [29]


> т.е. попробуй со значениями <= 922337203685477

Эх, если бы значения задавал я... ;)


 
Рамиль   (2003-12-10 08:09) [30]

EnableBCD на ситуацию не влияет. Если выставить false, то выдает число с плавающей точкой.
Есть еще какие нибудь идеи? Или придется качать специальные компоненты:(


 
sniknik   (2003-12-10 12:34) [31]

понятно что у нас драйвера разные, по > Рамиль © (09.12.03 11:38) [2] у тебя похоже не строку возврашает (как у меня) а число (длинна 8 как раз как в базе), у тебя только единственное неправильная интерпретация.

значится нужно переобразовать самому то что получаеш.

> EnableBCD на ситуацию не влияет. Если выставить false, то выдает число с плавающей точкой.
надеюсь Double? длинной 8?
попробуй
var
d: Double;
n: Int64 absolute d;
begin
d:= ADOTable1....как у тебя там;
? чему тут n будет равно?
возможно чуш будет там смотря как в рекордсете число записано (могут старшие и младшие байты/слова местами поменяны быть, в каком случае не помню может не в этом)
попробуй еще

type
trec = packed record
case tes: Boolean of
True: (vr: Int64);
False: (mas: array[0..7] of byte);
end;var
vr: trec;
begin
new(vr);
Table1.FieldByName("nrec").GetData(vr);
//читай заведомо известное значение (лутше поменьше 1 например)
//и потасуй байты в масиве так чтобы оно в числе получилось
//(ну не знаю я как оно там может лежать :((
end;
и кстати проверь ADOTable11.Recordset.Fields[0].ActualSize точно оно там 8?

если получится то для грида нужно будет в полях по Get/Set(Text) свою обработку вставлять.
а вот с Locate х.з. нужно попробовать.


 
Рамиль   (2003-12-11 09:05) [32]


> попробуй
> var
> d: Double;
> n: Int64 absolute d;
> begin
> d:= ADOTable1....как у тебя там;

Действительно фигня, что и следовало ожидать: вместо 16 выдает 4625196817309499392

> ADOTable11.Recordset.Fields[0].ActualSize точно оно там
> 8?

Хм... Вообще аж 19... Видимо пытается "вытянуть" как строку, а потом преобразует в ftFloat.
Так что
> type
> trec = packed record
> case tes: Boolean of
> True: (vr: Int64);
> False: (mas: array[0..7] of byte);
> end;

будет скорее всего бесмысленно.

Пока наиболее приемлемый вариант поставить EnableBCD в false и использовать [9], но Locate жутко ругается: "Произошли ошибки во время выполнения многошаговой операции. Проверьте значения всех состояний."


 
sniknik   (2003-12-11 10:40) [33]

> Хм... Вообще аж 19... Видимо пытается "вытянуть" как строку, а потом преобразует в ftFloat.
19 - тогда явно строкой (как и у меня)и преобразованием. а тогда у тебя и с минусом будут проблемы... (и естественно приведения к типу как в [31] в обоих случаях не пройдет :(

а 19 это с EnableBCD = false или true или в обоих случаях?

кстати если оно все одно строкой передается(и в рекордсете так хранится) то какая разница если ты сам значение в строку переведеш? в запросе явно.
как у тебя (Рамиль © (09.12.03 10:22)) уже сделано(?).
по моему никакой разници не будет.


 
Рамиль   (2003-12-11 11:47) [34]


> как у тебя (Рамиль © (09.12.03 10:22)) уже сделано(?).

Похоже так и придется оставить. В таком виде Locate работает, по крайней мере, хоть и медленно.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.013 c
1-25351
АлекСандр Мих
2003-12-22 11:05
2004.01.09
Работа с Debug


6-25468
lena19
2003-11-08 10:49
2004.01.09
как узнать мак адрес сетевой платы


1-25307
Андреев
2003-12-22 20:34
2004.01.09
Создание дочернего окна


14-25537
Alex_Bredin
2003-12-19 10:06
2004.01.09
Счетчик трафика


1-25432
AlexNx
2003-12-23 13:11
2004.01.09
Где взять русские XXConsts.pas для Delphi 7.0





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский