Форум: "Базы";
Текущий архив: 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.012 c