Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Длинное целое [Pervasive SQL 2000i]


Страницы:   1 2

Рамиль ©   (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]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо