ClientDataSet控件Filter问题!急,请高手帮忙!!
D7+MS SQL 数据库开发
使用ClientDataSet控件,在客户端作数据过虑。
由于需要多语言的特性,在数据库中使用了nvarchar数据类型,ClientDataSet中为 TWideStringField 对象。
发现的问题:
中文过虑不正常 (如果是TStringField对象的中文就没有问题)
不能在 TWideStringField 的列查询中使用Like,会报错。(TStringField对象中可以使用Like)
应该是由于Unicode的问题吧,那么上面的问题如何解决?
实在不行,不使用like也罢了,但是中文都不能过虑,实在说不过去呀!
拒绝以下类似答案:
1、加引号或使用quotedstr函数。
2、直接用SQL查询。
3、把nvarchar数据类型改为非Unicode数据类型
4、把TWideStringField改为TStringField (我测试过,这样作还是不行)
测试代码:
ClientDataSet1.Filtered:=false;
ClientDataSet1.Filter:=Edit1.Text;
ClientDataSet1.Filtered:=true;
当
Edit1.Text中的值为“name like 'c%'”时报错
Edit1.Text中的值为“name like '%某某%'”时报错
Edit1.Text中的值为“name = 'cs'”时过虑正常
Edit1.Text中的值为“name = '某某'”时过虑失败(数据集中有name为某某的记录,但过虑后无记录)
往高人指点!!多谢多谢!!!分不够我可以再给!!
问题点数:100、回复次数:19Top
1 楼soyisoft(Gino)回复于 2004-09-01 14:17:23 得分 0
顶,看看有高手没!Top
2 楼qiujsh(www.chinascsoft.com)回复于 2004-09-01 14:32:42 得分 0
语法结构应该是
“name = '*某某*'”
但是不知道什么原因,查不出来,clientdataset不支持楼主写的like的语法Top
3 楼soyisoft(Gino)回复于 2004-09-01 22:00:55 得分 0
楼上兄弟,TStringField是可以使用 like 查询的(包括中文),不信你试试。
但是TWideStringField就不能用like 而且中文都查不出。
应该是Unicode的问题,但是怎么解决哪?Top
4 楼soyisoft(Gino)回复于 2004-09-01 22:01:36 得分 0
继续期待高手的降临!Top
5 楼theone_jxm()回复于 2004-09-01 22:15:14 得分 5
是Unicode的问题,把delphi自动生成字段类型手工改称TStringFieldTop
6 楼theone_jxm()回复于 2004-09-01 22:17:49 得分 5
把TWideStringField改为TStringField ,有两个地方要改,以个是form文件,一个是.pas你都该国了?
Top
7 楼swei56(泥巴)回复于 2004-09-01 22:37:28 得分 10
TCustomClientDataSet的某些局限
操作函数 例子 是否支持
Comparisons
= State = 'CA' Yes
<> State <> 'CA' Yes
>= DateEntered >= '1/1/1998' Yes
<= Total <= 100,000 Yes
> Percentile > 50 Yes
< Field1 < Field2 Yes
BLANK State <> 'CA' or State = BLANK Yes
IS NULL Field1 IS NULL No
IS NOT NULL Field1 IS NOT NULL No
Miscellaneous
Like Memo LIKE '%filters%' No
In Day(DateField) in (1,7) No
* State = 'M*' Yes
------------------------------------------------------
如果要用filter功能和ado的话还是用三个ado数据集Top
8 楼zhlmxh(梦想成真)回复于 2004-09-02 00:55:50 得分 0
TDataSet的Filter不支持Like函数Top
9 楼soyisoft(Gino)回复于 2004-09-02 07:00:17 得分 0
列对象是由代码生成的,曾经尝试过将nvarchar类型的列对象改成TStringField但是会出类型不匹配的错误。Top
10 楼soyisoft(Gino)回复于 2004-09-02 07:09:55 得分 0
谁还有好的解决方式?Top
11 楼Jeff20040819(美丽)回复于 2004-09-02 17:31:35 得分 0
学习,接分Top
12 楼soyisoft(Gino)回复于 2004-09-03 13:31:55 得分 0
難道又要變成散分帖?!??!!!!Top
13 楼timelyraining(Henry)回复于 2004-09-03 13:52:25 得分 20
我以前遇到过类似的问题:
解决方法:
在SQL语句上把类型 varchar 与nvarchar 做转换。
Top
14 楼soyisoft(Gino)回复于 2004-09-03 16:40:40 得分 0
这个方法………… 写SQL就麻烦了。不过如果实在不行到是也可以考虑。
我试过在数据集里面用TStringField替代TWideStringField,但是会提示数据类型不匹配。
头痛,谁还有什么好办法吗?继续等…………Top
15 楼befree(似有似无)回复于 2004-09-04 11:22:29 得分 20
help里面都说了,高手也不能重写平台。
不用Filter,当然还得用sql的where
Filter不标准,是borland实现的,原则上应该少用。Top
16 楼soyisoft(Gino)回复于 2004-09-06 12:06:09 得分 0
用where当然可以,但是效率不高。还是想在前台过虑。Top
17 楼pengzhengling(重新来过)回复于 2004-09-14 10:27:54 得分 0
TClientDataSet的Filter不支持像LIKE这样的语法,即字符串匹配,只有用TClientDataSet.FilterRecord事件中,就可以解决
Accpet := DataSet.FieldByName('你要的字段').AsString.AnsiPos('过滤内容')>0Top
18 楼Dreamnest(创新永无止境)回复于 2004-11-04 17:25:46 得分 40
“timelyraining(恨天)
我以前遇到过类似的问题:
解决方法:
在SQL语句上把类型 varchar 与nvarchar 做转换。”
说得对,把NVARCHAR改成VARCHAR就可以过滤了,Top
19 楼soyisoft(Gino)回复于 2004-11-17 19:15:10 得分 0
谢谢大家,结帖!Top




