2008-11-17 15 views
4

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

Я нашел, как доступ к этим полям в 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-Statement?

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

Редактировать vradmilovic правильно, это работает:

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

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

+1

Ждать, закрытый как слишком локализованный? Я бы категорически не согласился. Я должен воскресить этот вопрос и повторить открытый голос. – 2016-11-22 02:26:46

ответ

2

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

-2

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

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

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

+0

приводит к нарушению доступа – 2008-11-17 16:52:43

0

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

0

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

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

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

Если вы хотите, чтобы извлечь ObjectGUID из AD вы должны бросить ObjectGUID к уникальному идентификатору:

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; 
Смежные вопросы