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;
Я не понимаю, почему это не сработало в первый раз, когда я попробовал.