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为某某的记录,但过虑后无记录)往高人指点!!多谢多谢!!!分不够我可以再给!!
由于需要多语言的特性,在数据库中使用了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为某某的记录,但过虑后无记录)往高人指点!!多谢多谢!!!分不够我可以再给!!
“name = '*某某*'”但是不知道什么原因,查不出来,clientdataset不支持楼主写的like的语法
操作函数 例子 是否支持
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 NoMiscellaneous
Like Memo LIKE '%filters%' No
In Day(DateField) in (1,7) No
* State = 'M*' Yes
------------------------------------------------------
如果要用filter功能和ado的话还是用三个ado数据集
解决方法:
在SQL语句上把类型 varchar 与nvarchar 做转换。
我试过在数据集里面用TStringField替代TWideStringField,但是会提示数据类型不匹配。头痛,谁还有什么好办法吗?继续等…………
不用Filter,当然还得用sql的where
Filter不标准,是borland实现的,原则上应该少用。
Accpet := DataSet.FieldByName('你要的字段').AsString.AnsiPos('过滤内容')>0
我以前遇到过类似的问题:
解决方法:
在SQL语句上把类型 varchar 与nvarchar 做转换。”说得对,把NVARCHAR改成VARCHAR就可以过滤了,