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为某某的记录,但过虑后无记录)往高人指点!!多谢多谢!!!分不够我可以再给!!

解决方案 »

  1.   

    语法结构应该是
    “name = '*某某*'”但是不知道什么原因,查不出来,clientdataset不支持楼主写的like的语法
      

  2.   

    楼上兄弟,TStringField是可以使用 like 查询的(包括中文),不信你试试。但是TWideStringField就不能用like 而且中文都查不出。应该是Unicode的问题,但是怎么解决哪?
      

  3.   

    是Unicode的问题,把delphi自动生成字段类型手工改称TStringField
      

  4.   

    把TWideStringField改为TStringField ,有两个地方要改,以个是form文件,一个是.pas你都该国了?
      

  5.   

    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 NoMiscellaneous
    Like Memo LIKE '%filters%' No
    In Day(DateField) in (1,7) No
    * State = 'M*' Yes
    ------------------------------------------------------
    如果要用filter功能和ado的话还是用三个ado数据集
      

  6.   

    列对象是由代码生成的,曾经尝试过将nvarchar类型的列对象改成TStringField但是会出类型不匹配的错误。
      

  7.   

    我以前遇到过类似的问题:
    解决方法:
    在SQL语句上把类型 varchar 与nvarchar 做转换。
      

  8.   

    这个方法………… 写SQL就麻烦了。不过如果实在不行到是也可以考虑。
    我试过在数据集里面用TStringField替代TWideStringField,但是会提示数据类型不匹配。头痛,谁还有什么好办法吗?继续等…………
      

  9.   

    help里面都说了,高手也不能重写平台。
    不用Filter,当然还得用sql的where
    Filter不标准,是borland实现的,原则上应该少用。
      

  10.   

    用where当然可以,但是效率不高。还是想在前台过虑。
      

  11.   

    TClientDataSet的Filter不支持像LIKE这样的语法,即字符串匹配,只有用TClientDataSet.FilterRecord事件中,就可以解决
    Accpet := DataSet.FieldByName('你要的字段').AsString.AnsiPos('过滤内容')>0
      

  12.   

    “timelyraining(恨天)
    我以前遇到过类似的问题:
    解决方法:
    在SQL语句上把类型 varchar 与nvarchar 做转换。”说得对,把NVARCHAR改成VARCHAR就可以过滤了,