在Delphi XE2中查找包含单引号的搜索值时发生TADO异常

3

使用MS SQL 2008 R2 (sp 2)或MS SQL 2005 (sp4)时,Delphi XE2(update2)存在问题。
form1.ado_m通过TADO数据集实现,未进行参数检查,使用本地64位sql。

var
  okd:boolean;
  dd:ansistring;

代码片段:

okd:=form1.ado_m.Locate('abcrow',dd,[loCaseInsensitive]); 

如果变量dd的值以单引号结尾(在调试器中会被转换为''),则会引发异常:

异常类EOleException,消息为“参数类型错误,超出可接受范围或彼此冲突”。

奇怪的是,如果变量dd中间有一个单引号字符,则可以正常工作。有什么解决方法吗?


尝试在定位语句中使用 QuotedStr(dd) 而非仅仅使用 dd,或者将值的赋值改为 dd := QuotedStr(Something); - Ken White
白先生 - 你尝试引用了dd。但是给我抛出了异常:$768FB9BC处出现了第一次异常,异常类为EOleException,消息为“多步操作生成错误。请检查每个状态值”。 - bartrat
尝试使用StringReplace()函数,将每个单引号替换为两个单引号。 - Marcus Adams
@bartrat:我无法解释QuotedStr的问题,因为您没有发布使用它的任何代码。实际上,您甚至没有发布任何代码来显示将任何内容分配给dd,尽管您声称问题就出在那里。 - Ken White
白先生,它失败了,因为dd被赋予了以下值:dd:='A1020778014#;]_69BO''' ; dd:=quotedstr(dd); okd:=form1.ado_m.Locate('abcrow',dd,[loCaseInsensitive]); 请注意:如果没有quotedstr命令,dd:='A0122063096*6\2!9B''S'可以正常工作。 - bartrat
没有“问题”搜索值,我无法给出答案。 - Arjen van der Spek
1个回答

2
该问题是由于搜索值中的井号(#)和引号一起造成的。
ADO查找方法使用:find。Criteria中的值可以是字符串、浮点数或日期。字符串值用单引号"#"(井号)标记括起来(例如,“state = 'WA'”或“state = #WA#”)。
尝试通过插入记录来替换井号或引号字符。
另一个选项是使用OnFilterRecord和filtered属性:
  ...
  FSearchValue := 'A1020778014#;]_69BO''';  // private field in TForm1
  ado_m.Filtered := true;
  try
    okd := not ado_m.IsEmpty;
  finally
    ado_m.Filtered := false;
  end;
  ...

procedure TForm1.ado_mFilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
begin
  Accept := SameText(DataSet.FieldByName('abcrow').AsString, FSearchValue);
end;

Arjen van der Spek:谢谢你的建议,确实是这个问题。我在XE2中找不到dataset.find。我不明白如何使用sametext会对我有帮助。是否有一种方法可以将#字符表示为文字而不是分隔符? - bartrat
1
在 Locate 方法中,您不能同时使用 # 和 `,但是如果您使用 OnFilterRecord 数据集事件,则可以。Find 方法用于 Locate 方法内部,它不是公共方法。 - Arjen van der Spek
感谢Spek先生的更新,您的建议和意见非常有帮助。 - bartrat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接