Форум: "Базы";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
ВнизGUID в поле таблицы DBF Найти похожие ветки
← →
aga123 (2004-03-02 10:00) [0]Добрый день мастера!
Помогите пожалуйста, ибо я застрял вот на чем:
Мне нужно поместить значение GUID в поле DBF таблицы.
Функция CoCreateGUID() формирует значение типа TGUID.
Я перелопатил кучу примеров, но в них везде используется строковое представление получаемое из GUIDToString(), но длина получаемого результата 38.
- А как же получить 16 байтное значение из CoCreateGUID()?
- Каков тип получаемого результата? Какого типа должно быть поле в таблице FOXPRO(!), чтобы поместить туда полученное значение?
Огромное спасибо.
← →
Anatoly Podgoretsky © (2004-03-02 10:08) [1]- А как же получить 16 байтное значение из CoCreateGUID()?
Creates a GUID, a unique 128-bit integer
← →
Johnmen © (2004-03-02 10:14) [2]Можно использовать
CreateClassID
для получения 32 байтной строки, каждый б.которой отображает полбайта из каждых байт 4 интегеров (128 бит).
← →
aga123 (2004-03-02 10:33) [3]2Anatoly Podgoretsky
Да, 128-bit integer, но как его заполучить в поле?
Вот мои действия:
var
ID: TGUID;
S: string;
iId : Longint;
sId : String;
begin
// Получаем GUID
if CoCreateGuid(Id) = s_OK then
begin
// Строковое значение получаем так
s := GUIDToString(Id);
// Но как быть здесь???
// как получить этот 128-bit integer
// в переменную iid, ну это то же что и в поле
//sID := IntToStr(iId); /// ?????
end;
end;
Или я чего-то не понимаю и упускаю из виду очевидное?
← →
Romkin © (2004-03-02 10:36) [4]А ты длину TGUID не смотрел? Это оно и есть, 16 байт.
← →
Delirium © (2004-03-02 10:37) [5]Думаю самое верное - использовать поле типа Binary(16)
← →
aga123 (2004-03-02 10:42) [6]2Romkin
Как посмотреть длину TGUID в заголовке Label:
Label1.Caption := IntToStr???(ID) ???
← →
Delirium © (2004-03-02 10:44) [7]"Как посмотреть длину TGUID в заголовке Label" - пора в орешник :)
← →
aga123 (2004-03-02 10:45) [8]Пардон, я хотел сказать увидеть в Label.Caption сам GUID :)
← →
Delirium © (2004-03-02 10:49) [9]GUIDToString - ты ведь и сам прекрасно знаешь ответ
← →
Romkin © (2004-03-02 10:49) [10]Если увидеть - то GUIDToString :)) А если юзать - то без этого :)
← →
aga123 (2004-03-02 11:00) [11]Спасибо!
Но неужели так и нельзя увидеть GUID неконвертированным, в виде 16 байтной последовательности закорючек? Так посмотреть захотелось, аж чешется :)
Спасибо всем за ответы. Извините за ...
← →
Romkin © (2004-03-02 11:01) [12]В окне просмотра по Ctrl+Alt+W :)
Или перемести эти 16 байт в строку...
← →
Delirium © (2004-03-02 11:29) [13]"Или перемести эти 16 байт в строку..." - вот, кстати, набросал довольно шуструю функцию :)
function GUIDToBinaryStr(const G:TGUID):string;
begin
SetLength(Result, 16);
Result[ 1]:=Chr((G.D1 and $FF000000) shr 24);
Result[ 2]:=Chr((G.D1 and $00FF0000) shr 16);
Result[ 3]:=Chr((G.D1 and $0000FF00) shr 8);
Result[ 4]:=Chr((G.D1 and $000000FF));
Result[ 5]:=Chr((G.D2 and $FF00) shr 8);
Result[ 6]:=Chr((G.D2 and $00FF));
Result[ 7]:=Chr((G.D3 and $FF00) shr 8);
Result[ 8]:=Chr((G.D3 and $00FF));
Result[ 9]:=Chr(G.D4[0]);
Result[10]:=Chr(G.D4[1]);
Result[11]:=Chr(G.D4[2]);
Result[12]:=Chr(G.D4[3]);
Result[13]:=Chr(G.D4[4]);
Result[14]:=Chr(G.D4[5]);
Result[15]:=Chr(G.D4[6]);
Result[16]:=Chr(G.D4[7]);
end;
← →
aga123 (2004-03-02 11:34) [14]Огромное спасибо Delirium!
Мое любопытство удовлетворено!
← →
aga123 (2004-03-02 12:02) [15]А что из себя представляет тип поля ftGuid из DBCommon.Pas?
Я имею в виду в каком виде он реализует GUID в строковом или в 16-bit integer?
Очевидно что скорее всего другое.
← →
Johnmen © (2004-03-02 12:16) [16]А так еще короче...:)
function SGUIDToString(GUID: TGUID) : string;
begin;
SetLength(Result,SizeOf(TGUID));
Move(GUID,pointer(Result)^,SizeOf(TGUID));
end;
← →
Delirium © (2004-03-02 12:16) [17]Если посмотреть реализацию TGuidField, то всё станет очевидно. И GUID там хранится как строка в 38 байт.
← →
Delirium © (2004-03-02 12:20) [18]> Johnmen © (02.03.04 12:16) [16]
"А так еще короче...:)" - да-уж, а я стрмозил :))
← →
aga123 (2004-03-02 12:24) [19]Огромное спасибо всем!
Вопрос можно считать закрытым.
Я уже экспериментирую с таблицей.
← →
Anatoly Podgoretsky © (2004-03-02 12:26) [20]Нормально использовать для хранения 38 байтовое строковое значение, тогда можно хранить абсолютно в любой базе, включая текстовые
← →
aga123 (2004-03-02 13:29) [21]Прошу прощения, вопрос не закрываем
Пример
В таблице FoxPro завожу два поля:
1) Guid : Character(Binary) (пробовал и Character(16))
2) SGuid : Character(38)
Кнопка <Создать GUID>:
procedure TForm1.Button1Click(Sender: TObject);
Var
Id :TGUID;
s : String;
Result :HRESULT;
begin
Result := CoCreateGuid(Id);
if Result = s_OK then
begin
s := GUIDToString(Id);
AdsTable1.Edit;
AdsTable1["SGuid"] := s; // все ОК
AdsTable1["Guid"] := Id; // incompatible types:
// "Variant" and "TGUID"
end;
end;
Опять двадцать пять???
Что-то я растерялся, отупел, ничего не понимаю...
← →
Delirium © (2004-03-02 13:38) [22]"растерялся, отупел" - похоже на то, для чего тебе функции написали, чтобы ты опять GUIDToString пользовал и получал 38 байт?
← →
aga123 (2004-03-02 13:44) [23]Да но функции писали для того чтобы привести к читаемому виду TGUID.
Но в [10] сказано:
Если увидеть - то GUIDToString :)) А если юзать - то без этого :)
И я так понял что если юзать никакого преобразования не нужно.
← →
aga123 (2004-03-02 15:00) [24]А поле SQuid это просто тестовое поле
В окончательном варианте останется Guid Character(Binary)
Так что же это получается: нельзя сохранить непосредственно сам GUID?
Обязательно нужны преобразованные варианты, либо в Char(28) через GUIDToString, либо в Char(16) через SGUIDToString() от Johnmen?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.033 c