关于Clientdataset数据集过滤的问题

crazy_boom 2016-09-16 01:16:16
delphi 7 Sql2008r2
组件:dbgrideh+ ClientDataSet + DataSetProvider +query
过滤代码:

procedure Tfrmwh.Edit1Change(Sender: TObject);
var str:string;
begin
str:='';
str:=trim(Edit1.Text);
if str = '' then
dbgrid1.DataSource.DataSet.Filter := ''
else
dbgrid1.DataSource.DataSet.Filter := 'mc like ''%' + str + '%'' ';
dbgrid1.DataSource.DataSet.Filtered := True;
end;

用几条数据做个例子
bh mc JC
101 酸奶 SN
102 蒙牛酸奶 MNSN
103 酸 S
104 伊利酸奶 YLSN
105 酸好奶 SHN

当str的值为 酸奶的时候 可以显示出以下内容
102 蒙牛酸奶
104 伊利酸奶
这里的问题是 为什么 酸奶 不显示出来??

当str的值为 蒙牛酸奶的时候一条记录也不显示

当str的值为 酸 的时候 一条记录也不显示
这里的问题是 为啥记录包含酸 的记录没有显示出来

当我将过滤字段换成JC 的时候
dbgrid1.DataSource.DataSet.Filter := 'JC like ''%' + str + '%'' ';
Str的值为 S 所有的记录都显示 输入 SN的时候 包含 SN 的内容都显示出来。为啥汉字就不可以呢???

...全文
2769 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
crazy_boom 2017-05-01
  • 打赏
  • 举报
回复
这纠结这个问题了 目前正在把代码中的 BDEQuery控件 换成AdoQuery......
lyhoo163 2016-12-01
  • 打赏
  • 举报
回复
引用 2 楼 crazy_boom 的回复:
因为 这种过滤的操作特别多 如果每次过滤 都是从服务器重新提取一遍数据 会不会加大服务器的压力啊 试用DataSet.Filter 这种方法 会不会减轻服务器的压力啊
这种方式,你要读取全部数据,再过滤。不如,直接过滤。部的数据量,基本一致。
Oraclers 2016-11-29
  • 打赏
  • 举报
回复
有没有试下将其强制转为WideString dbgrid1.DataSource.DataSet.Filter := 'mc like ''%' + WideString(UpperCase(Trim(edt1.Text))) + '%'' ';
crazy_boom 2016-11-28
  • 打赏
  • 举报
回复
引用 6 楼 Oraclers 的回复:
dbgrid1.DataSource.DataSet.Filter := 'mc like ''%' + str + '%'' ' 中文是双字节的,改成如下: dbgrid1.DataSource.DataSet.Filter := 'mc like N''%' + str + '%'' '
我把代码改成如下: dbgrid1.DataSource.DataSet.Filter := 'mc like N''%' + UpperCase(Trim(edt1.Text)) + '%'' '; 运行后 在edt1中输入 汉字或者字母点过滤 就会提示:

Project aousr.exe raised exception class EDatabaseError with message 'ClientDataSet1: Field 'N' not found'. Process stopped. Use Step or Run to continue.
Oraclers 2016-11-27
  • 打赏
  • 举报
回复
dbgrid1.DataSource.DataSet.Filter := 'mc like ''%' + str + '%'' ' 中文是双字节的,改成如下: dbgrid1.DataSource.DataSet.Filter := 'mc like N''%' + str + '%'' '
crazy_boom 2016-11-20
  • 打赏
  • 举报
回复
引用 3 楼 u011840021 的回复:
ClientDataSet + DataSetProvider +query 这是老的连法,现在新项目不会还这样做吧;
新项目 咋个连法? 是ADO吗?
jjpweb 2016-10-17
  • 打赏
  • 举报
回复
后百分号支持,如果是中文字符
jason131203 2016-10-17
  • 打赏
  • 举报
回复
ClientDataSet + DataSetProvider +query 这是老的连法,现在新项目不会还这样做吧;
crazy_boom 2016-10-14
  • 打赏
  • 举报
回复
因为 这种过滤的操作特别多 如果每次过滤 都是从服务器重新提取一遍数据 会不会加大服务器的压力啊 试用DataSet.Filter 这种方法 会不会减轻服务器的压力啊
lyhoo163 2016-09-16
  • 打赏
  • 举报
回复
C/S 三层下,ClientDataSet 不采取Filter过滤。因为,ClientDataSet从服务器一次性读取数据,不是动态的。 非C/S ,直接连接数据库,它是动态连接数据库,可以通过Filter过滤。 你可以通过ClientDataSet读取数据时,通过SQK语句,进行过滤:
  S:=Trim(Combobox3.Text);
  DateTimetoString(sDate1,'yyyy-MM',DateTimePicker2.Date);
  DateTimetoString(sDate2,'yyyy-MM',DateTimePicker3.Date);
  SQL:='select 年月,部门,床号,姓名,护理等级,托管费,护理费,伙食费,其它费,合计,'+
       '发票代码,发票号码,老人编号,身份证号,备注,ID from 老人收费统计 '+
       'where (姓名 LIKE '+#39+'%'+S+'%'+#39+') and (年月>='+#39+sDate1+#39+
       ') and (年月<='+#39+sDate2+#39+') order by ''姓名'',''年月''';
  DataModule1.ClientDataSet1.Active:=False;
  DataModule1.ClientDataSet1.DataRequest(SQL);
  DataModule1.ClientDataSet1.Active:=True;
  DBGridEh_AutoSize(DBGridEh1,DataSource1); // 用于DBGridEh数据集的连接和字段的设置
(姓名 LIKE '+#39+'%'+S+'%'+#39+') 就是:DataSet.Filter := 'mc like ''%' + str + '%'' 的效果。;

2,497

社区成员

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

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