Как установить GUID в качестве параметров запроса ADO из Delphi? - PullRequest
4 голосов
/ 17 ноября 2008

MS Access допускает числовой тип GUID (на немецком языке он называется «Replikations-ID», так что я думаю, на английском языке это будет «идентификатор репликации»), который хранится как 16-байтовое двоичное поле в базе данных.

Я нашел, как получить доступ к этим полям в Delphi с помощью TADOQuery / TADOTable с использованием

(TheQuery.FieldByName('SomeGuidField') as TGUIDField).AsGuid;

Но теперь я хочу выполнить SQL-запрос следующим образом:

SELECT * FROM SomeTable WHERE SomeGuidField=:AGuid

Я попытался задать для свойства TADOQuery.SQL вышеприведенное утверждение, но не нашел способа установить параметр AGuid так, чтобы можно было открыть запрос. Все, что я пробовал, приводило к ошибке (ADO / COM)

Не задано значение для одного или нескольких обязательных параметров

Например:

TheQuery.ParamByName('AGuid').Value := QuotedString(GuidToStr(AGuid));
TheQuery.Open; // <<== crashes here

Это тоже не работает:

TheQuery.ParamByName('AGuid').Value := GuidToStr(AGuid);
TheQuery.Open; // <<== crashes here

Я посмотрел, как работает TGuidField(...).AsGuid, и обнаружил, что сначала он конвертирует GUID в строку, а затем строку в вариант (и наоборот).

Работает нормально, если я всегда генерирую SQL-оператор следующим образом:

SELECT * FROM SomeTable WHERE SomeGuidField='<a guid goes here>'

Когда я передаю этот объект TADOQuery в программе, я бы хотел изменить только параметр AGuid, чтобы сохранить независимость большинства методов от действительного оператора SQL.

Есть ли другой способ установить GUID-параметр, кроме как всегда изменить полный SQL-оператор?

(Это должен быть GUID, потому что мне нужен глобальный уникальный идентификатор для синхронизации с другими базами данных, основанными на MS SQL или MS Access.)

Редактировать Врадмилович прав, это работает:

TheQuery.ParamByName('AGuid').Value := GuidToStr(AGuid);
TheQuery.Open;

Я не понимаю, почему это не сработало в первый раз, когда я попробовал.

Ответы [ 4 ]

2 голосов
/ 17 ноября 2008

Это правильный способ установки параметров с помощью ADO. Скорее всего, полученное вами сообщение вызвано опечаткой с некоторыми полями (вы получите такое же сообщение, если поле не существует).

0 голосов
/ 28 июля 2009

Вы не должны сохранять их как строки. Вы должны использовать uniqueidentifier. Используются две функции: GUIDToString и StringToGUID (не str-единицы).

Если вы копируете значения из активного каталога (в виде ftVarBytes), вы можете использовать метод assign, который сделает за вас чудо:

QueryIns.Parameters.ParamByName('GUID').Assign(Query.FieldByName('objectGUID'));

Если вы хотите извлечь objectGUID из AD, вам нужно привести objectGUID к uniqueidentifier:

Query.SQL.Add('select cast(objectGUID as uniqueidentifier) as objectGUID');
Query.SQL.Add('from vwADGroups');
Query.Open;
while not Query.Eof do begin
  Index := List.IndexOfName(Query.FieldByName('objectGUID').AsString);
  //...
end;
0 голосов
/ 18 мая 2009

Для чего я использую GUID, но я сохраняю их в БД в виде строк.

0 голосов
/ 17 ноября 2008

Если вы уверены, что параметр является TGuid, то должно работать следующее:

TGuidField(TheQuery.ParamByName('AGuid')).AsGuid

Хотя это делает GuidToString внутренне, поэтому проблема, возможно, та же. Стоит попробовать!

...