如何从Delphi中将GUID设置为ADO查询参数?

时间:2008-11-17 12:53:55

标签: delphi guid ado

MS Access允许使用数字类型GUID(在德语中称为'Replikations-ID',所以我猜在英语中将是'复制ID'),它在数据库中存储为16字节的二进制字段。

我找到了如何使用TADOQuery / TADOTable使用

在Delphi中访问这些字段
(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的数据库同步。)

修改 vradmilovic是对的,这有效:

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

我不明白为什么第一次尝试时它不起作用。

4 个答案:

答案 0 :(得分:2)

这是使用ADO设置参数的正确方法。您收到的消息很可能是由于某些字段的拼写错误(如果字段不存在,您会得到相同的消息)。

答案 1 :(得分:0)

值得我使用的是GUID,但我将它们保存在DB中作为字符串。

答案 2 :(得分:0)

您不应将它们保存为字符串。你应该使用uniqueidentifier。要使用的两个函数是GUIDToString和StringToGUID(不是str-one)。

如果您从活动目录中复制值(以ftVarBytes形式出现),您可以使用assign为您带来魔力:

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

如果要从AD中提取objectGUID,则需要将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;

答案 3 :(得分:-2)

如果您确定该参数是TGuid,则以下内容应该有效:

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

虽然这在内部有GuidToString,但问题可能相同。值得一试!