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;
我不明白为什么第一次尝试时它不起作用。
答案 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,但问题可能相同。值得一试!