delphi access 模糊查询 报错

晟蒷 2018-12-18 10:43:12
sql1:='select * from tabName where names like '''*高*''';
sql2:='select * from tabName where names like '''*a*''';
sql1查询报错,但是这个查询放在access查询没问题。sql2在程序中没问题
...全文
342 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Colly250 2018-12-21
  • 打赏
  • 举报
回复
通常中文有问题想到的是编码问题
晟蒷 2018-12-21
  • 打赏
  • 举报
回复
不是自带mdb,是access软件创建的,字段没错,names='a' ,可以查询,我估计是delphi10这个安装有问题,我用它测试保存excel也保存失败,另台电脑用delphi7 ,一样代码可以保存excel
  • 打赏
  • 举报
回复
select * from country where names like '%a%' 就报错//换成*一样
=========================================

你用的是Delphi自带的dbdemos.mdb吗,这个里面的字段名叫name,不是names
  • 打赏
  • 举报
回复
同样正常:

晟蒷 2018-12-21
  • 打赏
  • 举报
回复
我的运行环境是DELPHI 10, WIN7操作系统。就如"早打大打打核战争" 所操作的,
select * from country ,没问题
select * from country where id=1 没问题
select * from country where names='abc' 没问题
select * from country where names like '%a%' 就报错//换成*一样
晟蒷 2018-12-20
  • 打赏
  • 举报
回复
换成%一样不行,我现在切成adotable,然后过滤,查询获取数据可以,但是adoquery就是模糊查询不行,普通的names='a' 可以。什么原因?BUG?
  • 打赏
  • 举报
回复
%xxx%是支持的,这是标准SQL语法,不是Delphi自己实现的,Delphi只是把SQL传送给数据库引擎,由数据库引擎来解析执行。

doloopcn 2018-12-20
  • 打赏
  • 举报
回复
引用 10 楼 晟蒷 的回复:
换成%一样不行,我现在切成adotable,然后过滤,查询获取数据可以,但是adoquery就是模糊查询不行,普通的names='a' 可以。什么原因?BUG?


这只是Like的语法问题,而Like在数据库中与在Delphi中使用的语法也不尽一样,最重要的区别就是DELPHI中Filter的Like并不支持Like '%aaa'的写法,只支持 Like 'aaa%'
如果想DELPHI的Filter干更复杂的事得用Query的使用 OnFilterRecord 事件
例如:
procedure TForm1.Query1FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin
Accept := pos('胆',Dataset.FieldByName('System').asstring)>0;
end;


至于你说的还不行,我想不应该是BUG,而是程序中还有其他的问题吧,测试截图如下



  • 打赏
  • 举报
回复
什么原因?难道是人品问题~
一怒之下,我在虚拟机里装了个D7,事实证明根本没有你说的问题

  • 打赏
  • 举报
回复
如果你直接使用Access数据库引擎,那么可以使用*?通配符,如果你使用其他数据库引擎,ADO、BDE之类的,要使用标准SQL通配符%_
doloopcn 2018-12-19
  • 打赏
  • 举报
回复
ADO驱动中要使用标准通配符'%'
BlueStorm 2018-12-18
  • 打赏
  • 举报
回复
sql1:='select * from tabName where names like ''*高*'''; sql2:='select * from tabName where names like ''*a*''';
晟蒷 2018-12-18
  • 打赏
  • 举报
回复
ADOQuery1对象,sql的属性是SELECT * FROM tabname ,然后设置Active为true
DGGrid1正常显示(DBGrid1关联了DataSource1,DataSource1关联了ADOQuery1),
但是若把ADOQuery1的sql属性设置为select * from tabname where names like '*a*';

[518438A6]{adortl250.bpl} Data.Win.ADODB.TCustomADODataSet.OpenCursor (Line 3546, "Data.Win.ADODB.pas" + 5) + $70
[50068CA0]{rtl250.bpl } System.@CheckAutoResult (Line 38252, "System.pas" + 4) + $6
[518438A6]{adortl250.bpl} Data.Win.ADODB.TCustomADODataSet.OpenCursor (Line 3546, "Data.Win.ADODB.pas" + 5) + $70
[511A11A9]{dbrtl250.bpl} Data.DB.TDataSet.SetActive (Line 12659, "Data.DB.pas" + 12) + $7
[50120BDE]{rtl250.bpl } System.TypInfo.SetOrdProp (Line 2871, "System.TypInfo.pas" + 37) + $0
[211ECB3E]{designide250.bpl} DesignEditors.TPropertyEditor.SetOrdValue (Line 840, "DesignEditors.pas" + 2) + $E
[21243A67]{designide250.bpl} VCLEditors.TBooleanProperty.MouseUp (Line 1900, "VCLEditors.pas" + 5) + $10
[213F04CD]{vclide250.bpl} PropBox.TCustomPropListBox.ItemMouseUp (Line 1646, "PropBox.pas" + 17) + $1B
[213F06C3]{vclide250.bpl} PropBox.TCustomPropListBox.MouseUp (Line 1711, "PropBox.pas" + 1) + $D
[50AB56C0]{vcl250.bpl } Vcl.Controls.TControl.DoMouseUp (Line 7570, "Vcl.Controls.pas" + 2) + $28
[50AB5742]{vcl250.bpl } Vcl.Controls.TControl.WMLButtonUp (Line 7583, "Vcl.Controls.pas" + 9) + $6
[213F5F58]{vclide250.bpl} IDEInspListBox.TInspListBox.WMLButtonUp (Line 1643, "IDEInspListBox.pas" + 3) + $4
[50AB4D1A]{vcl250.bpl } Vcl.Controls.TControl.WndProc (Line 7326, "Vcl.Controls.pas" + 91) + $6
[0D685164]{TrackingSystem250.bpl} TrackingSystemHelp.CBTHookProc (Line 211, "TrackingSystemHelp.pas" + 27) + $F
[50AB908F]{vcl250.bpl } Vcl.Controls.TWinControl.IsControlMouseMsg (Line 9923, "Vcl.Controls.pas" + 1) + $9
[50AB9881]{vcl250.bpl } Vcl.Controls.TWinControl.WndProc (Line 10160, "Vcl.Controls.pas" + 158) + $6
[50ADE175]{vcl250.bpl } Vcl.StdCtrls.TCustomListBox.WndProc (Line 7243, "Vcl.StdCtrls.pas" + 55) + $5
[50AB8EA0]{vcl250.bpl } Vcl.Controls.TWinControl.MainWndProc (Line 9867, "Vcl.Controls.pas" + 3) + $6
[5016E7EC]{rtl250.bpl } System.Classes.StdWndProc (Line 17363, "System.Classes.pas" + 11) + $2
[50C01907]{vcl250.bpl } Vcl.Forms.TApplication.ProcessMessage (Line 10607, "Vcl.Forms.pas" + 23) + $1
[50C0194A]{vcl250.bpl } Vcl.Forms.TApplication.HandleMessage (Line 10637, "Vcl.Forms.pas" + 1) + $4
[50C01C7D]{vcl250.bpl } Vcl.Forms.TApplication.Run (Line 10775, "Vcl.Forms.pas" + 26) + $3

这个是报错。
lyhoo163 2018-12-18
  • 打赏
  • 举报
回复

sql1:='select * from tabName where names like '+#39+'%高%'+#39;

试试。
  • 打赏
  • 举报
回复
与Access无关,你不是在Access里直接查询,而是通过数据库引擎查询,数据库引擎支持标准SQL就可以
晟蒷 2018-12-18
  • 打赏
  • 举报
回复
引用 3 楼 早打大打打核战争 的回复:
sql1:='select * from tabName where names like ''%高%''';

access 用%不合适
  • 打赏
  • 举报
回复
sql1:='select * from tabName where names like ''%高%''';
晟蒷 2018-12-18
  • 打赏
  • 举报
回复
sql1:='select * from tabName where names like ''*高*'''; 也不行

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧