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;
我不明白为什么我第一次尝试它时它不起作用。