Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.09;
Скачать: CL | DM;

Вниз

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

 
Рамиль ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.024 c
1-25335
vasyaVN
2003-12-22 13:01
2004.01.09
Перерисовка компонента ТCustomControl


14-25513
Stilgar
2003-12-15 20:17
2004.01.09
Чем Windows 2000 лучше XP?


11-25268
tamerlan311
2003-04-14 00:29
2004.01.09
Форум


4-25649
Popova
2003-11-06 16:47
2004.01.09
Узнать текущего пользователя


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