我用tclientdataset控件提交数据到sql server数据库,有时会出现汉字被截断的问题,22个汉字被截断成11个,是不是和系统的字符集有关,因为最近才重安装过XP系统,请指点.具体代码如下:
dm.cds_use0.Close;    
dm.cds_use0.CommandText := 'insert into A(title) values(:title)';
dm.cds_use0.Params.ParamByName('title').Size := length(B.title);
dm.cds_use0.Params.ParamByName('title').DataType := ftWideString;
dm.cds_use0.Params.ParamByName('title').AsString:= B.title;
dm.cds_use0.Execute;
跟踪到delphi程序里面,发现起初的长度是符合实际情况,字长44,汉字也显示的完整,但到了后来,有某段代码中title的汉字都变成了?(问号).无法跟踪程序到底,估计有好几百步.
请教了

解决方案 »

  1.   

    和系统的字符集没有多大关系,可能和DB表的字符集有关系。你的title是中文字是对应的应该是wideString,低版本的DataSet控件只有AsString没有AsWideString这样的类型,D2009应该就有了不没用过。不过你的问题有一个办法可以解决,就是把insert的SQL语句里面的title组合起来不用参数传递。你可以直接写insert into A(titls) values (''测试用''),试试看。应该没有问题。
      

  2.   


    將 varchar  改為 nvarchar
      

  3.   

    这个已经是老问题了,要么不用参数,要么就用这种方式解决http://www.knowsky.com/336102.html
      

  4.   

    你试试把执行的sql语句提取出来,看插入的数据是否已经被截取;或者在sql中单独执行一个sql语句,然插入的数据达到最大,看能不能插入到表中,如果不行就该下数据类型的长度
      

  5.   

    to willflyz 请问什么是DB字符集,如何设置或修改
    1.直接提交当然可以,但是没有经过优化,提交很容易失败
    2.beifangke提供的文章已经看过,我跟踪程序,找不到文章所说的TCustomADODataSet.PSSetCommandText涵数
    也许delphi快要消亡了,所以关注的人少了,
      

  6.   

    你用的数据库是什么,如果SQL Server在表的属性里面可以看到的叫排序规则如,Chinese_PRC_CI_AS,Chinese...
    你单独拿一条SQL语句去执行插入中文字就知道了.
      

  7.   

    数据库没有问题,三层你的SQL语句应该放到应用服务端,用接口去调用,接口类型里面字串类型是BSTR,这个就是对应wideString的,这样传汉字参数进去就不会有问题.你原来是用ClientDataSet直接执行SQL的,这样不太好,把对DB的相关操作尽可能写在服务端.
      

  8.   

    to willflyz,请问能举个简单例子说明吗?不太理解你的意思?是不是做个存储过程?
      

  9.   

    为什么以前没有被截断的现象,重安装的系统和delphi后出现这种汉字被截断的现象,是和delphi的缺省字符集有关吗?请高手指点,很急哦
      

  10.   

    是不是应该下载个2009版的delphi用用
      

  11.   

    你可以打开SQL的事件探查器,把直接插入的语句和在程序调用的执行语句调出来看,先分析哪一部分出了问题
      

  12.   

    to zengjingsha2010 和数据库无关,按你的方法试过了,传到数据库时已经被截断,关键是有没有人用过这种方式提交数据,没有经历就没有体会,估计此题无解
      

  13.   

    已下载delphi2007,发现tSocketConnection组件找不到,请问delphi2007用什么组件取代了socketconnection组件?