SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » Проблема при работе с полями типа GUID в FibPlus через Variant
Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1602] Mon, 13 February 2023 14:10 Переход к следующему сообщению
jonikDk в настоящее время не в онлайне  jonikDk
Сообщений: 5
Зарегистрирован: August 2022
Junior Member
Нужно на клиенте было прочитать данные из одной таблицы и записать в другую
Поля и параметры читалиcь через Value (Variant)
И обломался на чтении поля guid (CHAR(16) CHARACTER SET OCTETS COLLATE OCTETS), при чём не на всех guid. Обломался в том плане, что источник не совпал с получателем. Очень удивился.

Вот один из проблемных guid: 12C472DA-A5FA-7A46-A666-68F7FB1BA920. Это исходный guid. В источнике получается DA72C412-FAA5-467A-A666-68F7FB1BA900

Что делать я более менее представляю. Править исходники
метод
function TFIBXSQLVAR.GetAsVariant: Variant;
или вообще
function TFIBXSQLVAR.GetAsAnsiString: Ansistring;

глубоко ещё не смотрел.

Вдруг кто сталкивался и делал похожие изменения. От помощи не откажусь. Потому что изменения надо ещё протестить будет, а это время и ошибки.

[Обновления: Mon, 13 February 2023 14:12]

Известить модератора

Re: Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1603 является ответом на сообщение #1602] Mon, 13 February 2023 14:28 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 889
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
а у Хвастунова как отображается?
Re: Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1605 является ответом на сообщение #1603] Mon, 13 February 2023 15:32 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 415
Зарегистрирован: August 2022
Senior Member
Ты бы хоть версию сервера назвал, чудо...
Re: Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1606 является ответом на сообщение #1602] Mon, 13 February 2023 16:29 Переход к предыдущему сообщениюПереход к следующему сообщению
 в настоящее время не в онлайне 
Сообщений: 198
Зарегистрирован: September 2022
Senior Member
>Что делать я более менее представляю. >Править исходники

Вот и нафига? Ты точно знаешь, что у тебя поле - ровно 16 восьмибитных символов, и зачем тебе эти AsGuid или AsVariant?
Re: Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1607 является ответом на сообщение #1606] Mon, 13 February 2023 16:48 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 415
Зарегистрирован: August 2022
Senior Member
В FIb+ нет свойства AsBinary. Вот и извращаются через строки и варианты.
Re: Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1608 является ответом на сообщение #1607] Mon, 13 February 2023 17:13 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 889
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
SD писал(а) Mon, 13 February 2023 16:48
В FIb+ нет свойства AsBinary. Вот и извращаются через строки и варианты.
видимо имеется в виду AsGUID ?
Re: Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1609 является ответом на сообщение #1602] Mon, 13 February 2023 18:07 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
jonikDk писал(а) Mon, 13 February 2023 14:10

12C472DA-A5FA-7A46-A666-68F7FB1BA920
DA72C412-FAA5-467A-A666-68F7FB1BA900
Забавное превращение. Первая четверка байт и следующие две пары зеркально отразились, в то время как последняя восьмерка осталась неизменной (в последнем байте описка, скорее всего). Очень похоже, как если бы данные легли в структуру, первая половина которой объявлена как числа, а вторая - как строка или набор байт. При этом "зеркальную" половину сперва записали как числа, а прочитали, как байты, или наоборот.
Re: Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1610 является ответом на сообщение #1609] Mon, 13 February 2023 18:59 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 889
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
VCL-ный TGuidField хранит значение в стрингах.
function TGuidField.GetAsGuid: TGUID;
var
  S: string;
begin
  S := GetAsString;
  if S <> '' then
    Result := StringToGuid(S) else
    Result := GUID_NULL;
end; 
Re: Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1611 является ответом на сообщение #1609] Mon, 13 February 2023 19:04 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
Точнее, скорее, вот так. Записано как
record
    data1 : dword;
    data2 : word;
    data3 : word;
    data4 : byte[0..7];
end;
а прочитано как
    data : byte[0..15];
Или в обратном направлении. Используйте что-нибудь одно.
Re: Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1612 является ответом на сообщение #1611] Mon, 13 February 2023 19:10 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
И философское. Никогда не мог понять, зачем единый 128-битный идентификатор разделять на какие-то бессмысленные неравные по-разному представляемые части, а визуально еще и избыточными черточками нагружать. Кто-нибудь имеет соображения на этот счет?
Re: Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1613 является ответом на сообщение #1612] Mon, 13 February 2023 20:45 Переход к предыдущему сообщениюПереход к следующему сообщению
 в настоящее время не в онлайне 
Сообщений: 198
Зарегистрирован: September 2022
Senior Member
shalamyansky писал(а) Mon, 13 February 2023 19:10
И философское. Никогда не мог понять, зачем единый 128-битный идентификатор разделять на какие-то бессмысленные неравные по-разному представляемые части, а визуально еще и избыточными черточками нагружать. Кто-нибудь имеет соображения на этот счет?
Длинная, захватывающая воображение история: https://en.m.wikipedia.org/wiki/Universally_unique_identifie r
Re: Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1614 является ответом на сообщение #1613] Tue, 14 February 2023 12:28 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 889
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
МорскойДесант
. Длинная, захватывающая воображение история: https://en.m.wikipedia.org/wiki/Universally_unique_identifie r
прекрасное чтиво! Very Happy
всю ночь не спал, пытаясь переварить:
"Microsoft's COM/OLE libraries, use a little-endian format, but appear mixed-endian with the first three components of the UUID as little-endian and last two big-endian, due to the missing byte dashes when formatted as a string."

кайф!

[Обновления: Tue, 14 February 2023 12:28]

Известить модератора

Re: Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1615 является ответом на сообщение #1614] Tue, 14 February 2023 13:19 Переход к предыдущему сообщениюПереход к следующему сообщению
jonikDk в настоящее время не в онлайне  jonikDk
Сообщений: 5
Зарегистрирован: August 2022
Junior Member
Извиняюсь, изначально писал в телеграмме, там написал про версию сервера, а потом в телеге посоветовали сюда написать.
Сервер FB3
Re: Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1616 является ответом на сообщение #1609] Tue, 14 February 2023 13:23 Переход к предыдущему сообщениюПереход к следующему сообщению
jonikDk в настоящее время не в онлайне  jonikDk
Сообщений: 5
Зарегистрирован: August 2022
Junior Member
shalamyansky писал(а) Mon, 13 February 2023 18:07
jonikDk писал(а) Mon, 13 February 2023 14:10

12C472DA-A5FA-7A46-A666-68F7FB1BA920
DA72C412-FAA5-467A-A666-68F7FB1BA900
Забавное превращение. Первая четверка байт и следующие две пары зеркально отразились, в то время как последняя восьмерка осталась неизменной (в последнем байте описка, скорее всего). Очень похоже, как если бы данные легли в структуру, первая половина которой объявлена как числа, а вторая - как строка или набор байт. При этом "зеркальную" половину сперва записали как числа, а прочитали, как байты, или наоборот.
Нет, не описка, это как раз, как я понимаю основная проблема. А то что зеркально, это скорее всего мой косяк. Смешал FB и Delphi.
Re: Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1617 является ответом на сообщение #1607] Tue, 14 February 2023 13:26 Переход к предыдущему сообщениюПереход к следующему сообщению
jonikDk в настоящее время не в онлайне  jonikDk
Сообщений: 5
Зарегистрирован: August 2022
Junior Member
SD писал(а) Mon, 13 February 2023 16:48
В FIb+ нет свойства AsBinary. Вот и извращаются через строки и варианты.
В FibPlus есть AsGuid и работает отлично.
Но проблема как понять в общем случае, что в этом поле guid, а не просто Char(16)
Re: Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1618 является ответом на сообщение #1617] Tue, 14 February 2023 13:50 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 889
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
jonikDk
. В FibPlus есть AsGuid и работает отлично.
Но проблема как понять в общем случае, что в этом поле guid, а не просто Char(16)
если там хрень, то виндовая функция GUIDFromString() вернёт FALSE.
Re: Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1619 является ответом на сообщение #1618] Tue, 14 February 2023 14:27 Переход к предыдущему сообщениюПереход к следующему сообщению
jonikDk в настоящее время не в онлайне  jonikDk
Сообщений: 5
Зарегистрирован: August 2022
Junior Member
МП писал(а) Tue, 14 February 2023 13:50
jonikDk
. В FibPlus есть AsGuid и работает отлично.
Но проблема как понять в общем случае, что в этом поле guid, а не просто Char(16)
если там хрень, то виндовая функция GUIDFromString() вернёт FALSE.
Ага, тоже были мысли от противного сделать.
Re: Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1620 является ответом на сообщение #1619] Tue, 14 February 2023 15:04 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 889
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
jonikDk
МП
. если там хрень, то виндовая функция GUIDFromString() вернёт FALSE.
. Ага, тоже были мысли от противного сделать.
только учти, её нужно импортировать из Shell32.dll по номеру, а не по имени.

https://learn.microsoft.com/ru-ru/windows/win32/shell/guidfr omstring
Re: Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1622 является ответом на сообщение #1620] Tue, 14 February 2023 15:53 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 415
Зарегистрирован: August 2022
Senior Member
С чего бы в поле BINARY(16) быть "String"?..
Re: Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1623 является ответом на сообщение #1622] Tue, 14 February 2023 15:59 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 889
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
SD
. С чего бы в поле BINARY(16) быть "String"?..
тьфу, блин.
я чего-то подумал что TC хранит представление, а не bin

Re: Проблема при работе с полями типа GUID в FibPlus через Variant [сообщение #1625 является ответом на сообщение #1614] Tue, 14 February 2023 17:43 Переход к предыдущему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
МорскойДесант
Длинная, захватывающая воображение история: https://en.m.wikipedia.org/wiki/Universally_unique_identifie r
МП
прекрасное чтиво! Very Happy
всю ночь не спал, пытаясь переварить:
"Microsoft's COM/OLE libraries, use a little-endian format, but appear mixed-endian with the first three components of the UUID as little-endian and last two big-endian, due to the missing byte dashes when formatted as a string."

Этот мир придуман не нами...

Спасибо!
Предыдущая тема: Выполнение запроса очень тормозится на объединении
Следующая тема: Как определить причину тормозов Firebird за 95 минут?
Переход к форуму:
  


Текущее время: Wed Dec 18 04:44:45 GMT+3 2024

Общее время, затраченное на создание страницы: 0.01103 секунд