所以我有一个 AdoTable 连接到数据库(mdb)和使用它的 DataSource。DBGrid 使用此数据源...
我试图根据用户输入过滤 AdoTable。有 3 个重要列:姓名、姓氏和 ID。我想出了类似这样的临时解决方案:
AdoTable.filter:='surname like ' +
QuotedStr('%'+edit1.text+'%')+' or name like ' +
QuotedStr('%'+edit1.text+'%')+' or ID like ' +
QuotedStr('%'+edit1.text+'%');
AdoTable.filtered:=true;
它确实有效,但它并没有完全按照我想要的那样做......(在搜索 name 和 surename 时,它不会找到任何东西,因为它只在一列中显示)。所以后来我把我的代码修改成这样:
AdoTable.filter:='surname & " " & name like ' +
QuotedStr('%'+edit1.text+'%')+' or name & " " & surname like ' +
QuotedStr('%'+edit1.text+'%')+' or ID like ' +
QuotedStr('%'+edit1.text+'%');
AdoTable.filtered:=true;
现在这将完全符合我的要求,但会引发异常(EOleException:参数类型错误,超出可接受范围或相互冲突)。这让我很吃惊,因为我认为它应该表现为 sql 命令中的 where 子句(并且它可以完美地作为命令工作)。
我尝试用“+”替换“&”。我可以拆分输入文本,但我不想这样做(如果你有 Robin van Persie、Ahmad ibn Hanbal 等名字,它会很糟糕。)
或者,我可以重写整个程序以使用查询而不是表,但我真的不想这样做(这也意味着我将获得新的 recordSet 每次用户都会更改 edit1.text 而不仅仅是过滤)。
有任何想法吗?
编辑:所以有效的命令看起来像这样
select * from person where surname & " " & name like '%John Smith%' or name & " " & surname like '%John Smith%' or ID like '%John Smith%'
过滤器看起来像这样(它会触发异常)
surname & " " & name like '%John Smith%' or name & " " & surname like '%John Smith%' or ID like '%John Smith%'
请注意,可能有“hn Smith”而不是“John Smith”,因此它也会找到“Kahn Smithers”等。