4

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

我发现如何使用 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-Parameter 以使大多数方法与实际的 SQL 语句无关。

除了总是更改完整的 SQL 语句之外,还有其他方法可以设置 GUID 参数吗?

(它必须是一个 GUID,因为我需要一个全局唯一标识符来与基于 MS SQL 或 MS Access 的其他数据库同步。)

编辑 vradmilovic 是对的,这有效:

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

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

4

4 回答 4

2

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

于 2008-11-17T13:40:41.320 回答
0

值得我使用 GUID,但我将它们作为字符串保存在数据库中。

于 2009-05-18T12:41:30.130 回答
0

您不应该将它们保存为字符串。您应该使用唯一标识符。要使用的两个函数是 GUIDToString 和 StringToGUID(不是 str-ones)。

如果您从活动目录中复制值(以 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;
于 2009-07-28T08:41:23.777 回答
-2

如果您确定参数是 TGuid,那么以下应该可以工作:

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

尽管这在内部执行了 GuidToString,但问题可能相同。值得一试!

于 2008-11-17T13:37:07.597 回答