首页 文章

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

提问于
浏览
4

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 -Parameter以使大多数方法与实际的SQL语句无关 .

有没有其他方法来设置GUID参数而不是总是更改完整的SQL语句?

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

Edit vradmilovic是对的,这有效:

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

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

4 回答

  • 0

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

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

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

  • 2

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

  • -2

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

  • 0

    你不应该把它们保存为字符串 . 你应该使用uniqueidentifier . 要使用的两个函数是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;
    

相关问题