![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Длинное целое [Pervasive SQL 2000i]
Рамиль © (2003-12-09 10:22:00)
В БД первичный ключ имеет разрядность 64 бит. Как его вытащить в программу? Если пользоваться BDE то он преобразует его в число с плавающей точкой. ADO пишет BCD overflow. Обращение к полю как Variant тоже ничего не дает. Единственный приемлемый вариант, который я нашел, это преобразовывать число в строку в select функцией СУБД. Может еще как нибудь можно?
Рамиль (2003-12-11 11:47:00) [1]
> как у тебя (Рамиль © (09.12.03 10:22)) уже сделано(?).
Похоже так и придется оставить. В таком виде Locate работает, по крайней мере, хоть и медленно.
sniknik (2003-12-11 10:40:00) [2]
> Хм... Вообще аж 19... Видимо пытается "вытянуть" как строку, а потом преобразует в ftFloat.
19 - тогда явно строкой (как и у меня)и преобразованием. а тогда у тебя и с минусом будут проблемы... (и естественно приведения к типу как в [31] в обоих случаях не пройдет :(
а 19 это с EnableBCD = false или true или в обоих случаях?
кстати если оно все одно строкой передается(и в рекордсете так хранится) то какая разница если ты сам значение в строку переведеш? в запросе явно.
как у тебя (Рамиль © (09.12.03 10:22)) уже сделано(?).
по моему никакой разници не будет.
Рамиль (2003-12-11 09:05:00) [3]
> попробуй
> 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-10 12:34:00) [4]
понятно что у нас драйвера разные, по > Рамиль © (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-10 08:09:00) [5]
EnableBCD на ситуацию не влияет. Если выставить false, то выдает число с плавающей точкой.
Есть еще какие нибудь идеи? Или придется качать специальные компоненты:(
Рамиль (2003-12-09 19:41:00) [6]
> т.е. попробуй со значениями <= 922337203685477
Эх, если бы значения задавал я... ;)
sniknik (2003-12-09 18:26:00) [7]
> Создает только так
> 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 16:05:00) [8]
> 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 15:20:00) [9]
ZrenBy © (09.12.03 15:15) [25]
забавно
INSERT INTO Table1 (id,bint) VALUES (3, -9223372036854775808)
в гриде вижу урезанное на 1 символ
-92233720368547758
длинну неправильно обрабатывает (похоже берет длинну только числа, знак не учитывает)
ZrenBy (2003-12-09 15:15:00) [10]
>>sniknik © (09.12.03 15:09) [24]
А
INSERT INTO Table1 (id,bint) VALUES (2, -9223372036854775807)
sniknik (2003-12-09 15:09:00) [11]
> При использовании 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)... (в самом битриве нормально большое число)
Polevi (2003-12-09 14:56:00) [12]
EnableBCD
Апач (2003-12-09 14:42:00) [13]
ой рамиль он большой :(
высылать небуду
попробуй скачаи с их офицального саита
вышлю тока свои исходники
Апач (2003-12-09 14:36:00) [14]
Рамиль да у нас общая беда :)))
щас поищу и вышлю
Рамиль (2003-12-09 14:35:00) [15]
> Апач (09.12.03 14:26) [18]
Я уже подумывал напрямую к DLL обращаться. Пришли, plz ;)
Рамиль (2003-12-09 14:29:00) [16]
> явно сделай такой поле типа ftBytes - никаких попыток неявных
> преобразований выполняться при этом не должно по идее
То же самое получается, наверное в обратной последовательности байт записано.
> небось с Галактикой паришся :)))))
Догадливый какой;) С ней самой, родимой, будь она не ладна...
Апач (2003-12-09 14:26:00) [17]
Если хочешь подарим
могу подарить собственные патуги работы с етой функцией
Я скока искал нифига не нашол.... :(
Рамиль (2003-12-09 14:24:00) [18]
> Апач (09.12.03 14:14) [14]
Нет вообщето, их еще скачать надо... Но должно же стандартными методами работать!
Digitman (2003-12-09 14:23:00) [19]
> При использовании ADO это не работает вообще, пишет не могу
> преобразовать Decimal в Currency
явно сделай такой поле типа ftBytes - никаких попыток неявных преобразований выполняться при этом не должно по идее
Апач (2003-12-09 14:20:00) [20]
небось с Галактикой паришся :)))))