Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-1078648724
juiceman
2004-03-07 11:38
2004.04.04
остановить сервис


3-1078412500
Евген
2004-03-04 18:01
2004.04.04
Проблема с Locate


1-1079192406
Vilux
2004-03-13 18:40
2004.04.04
Помогите с потоками


3-1078932076
ser k
2004-03-10 18:21
2004.04.04
есть две таблицы


11-1058450384
savva
2003-07-17 17:59
2004.04.04
RichEdit и OLE support - какая то засада...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский