用clientDataSet执行SQL语句时传参发生中文被截断的问题

lifanxi 2003-03-04 09:04:03
类如下面的代码,导致了参数中的中文被截短一半,求教!
clientdataset1.close;
clientdataset1.commandtext := 'update t set f=:f';
clientdataset1.params[0].value := '会被截断的中文';
clientdataset1.execute;
提交后写到SQL Server中的数据就成了“会被载”;
环境:Delphi 7 + SQL Server 2000 中文版,用DCOM连。
如果不用参数,直接写
clientdataset1.close;
clientdataset1.commandtext := 'update t set f=''会被截断的中文''';
clientdataset1.execute;
是好的。

...全文
227 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
liumengchuan 2003-03-09
  • 打赏
  • 举报
回复
至今没发现
并且,就算分配多了,也不会发生问题,至多只是多分配了资源
lifanxi 2003-03-09
  • 打赏
  • 举报
回复
谢谢各位,问题解决了,用的就是上面说的改adodb.pas第1227行的方法。
不过不知道这样会不会带来一些副作用,比如:在有些情况下长度算成两倍了之类的。
请高手再来个答复吧,明天就给分,谢谢!
halfdream 2003-03-08
  • 打赏
  • 举报
回复
你在PROJECT的编译选项里面选中use debug dcus就可以跟踪进去了。
lifanxi 2003-03-08
  • 打赏
  • 举报
回复
To: bingjiling
谢谢您的提醒,不过我没有犯这样的低级错误。
bingjiling 2003-03-08
  • 打赏
  • 举报
回复
看看是不是 这个字段定义的太短了
lifanxi 2003-03-08
  • 打赏
  • 举报
回复
To halfdream:
请教应该如何跟踪VCL的源码,我在adodb.pas的1227行做了断点,但程序并不会在这里停下来。
hch_45 2003-03-07
  • 打赏
  • 举报
回复
改为:
clientdataset1.close;
clientdataset1.commandtext := 'update t set f=:f';
ClientDataSet1.Params.ParamByName('f').AsString:='会被截断的中文';
//或者 ClientDataSet1.Params.ParamByName('f').Value:='会被截断的中文';

clientdataset1.execute;

试试...
hch_45 2003-03-07
  • 打赏
  • 举报
回复
改为:
clientdataset1.close;
clientdataset1.commandtext := 'update t set f=:f';
ClientDataSet1.Params.ParamByName('').AsString:='会被截断的中文';
//或者 ClientDataSet1.Params.ParamByName('').Value:='会被截断的中文';

clientdataset1.execute;

试试...
liumengchuan 2003-03-07
  • 打赏
  • 举报
回复
我以前给borland公司发过不少delphi的bug,其中就包括这个
不知道borland公司有没有改正
不过我现在已经不搞delphi了,转向java了
halfdream 2003-03-07
  • 打赏
  • 举报
回复
跟踪了一下VCL,确实如 liumengchuan() 说的那样.
bee2518 2003-03-07
  • 打赏
  • 举报
回复
该用oracle就不会出问题了
liumengchuan 2003-03-07
  • 打赏
  • 举报
回复
你在服务器端用的是ADO吧?
我以前写com+的时候也遇到过类似的问题
仔细查看了源代码,发现了一个Bug
adodb.pas
1227行
Result := Length(PWideString(@TVarData(Value).VOleStr)^);
将PWideString改成PAnsiString,重新编译就可以了(或者将改动后的文件拷贝到工程目录下)

或者:程序硬性指定param的datasize(时间太长了,忘了是不是这个名字了)
liumengchuan 2003-03-07
  • 打赏
  • 举报
回复
test
lifanxi 2003-03-07
  • 打赏
  • 举报
回复
谢谢各位。hch_45的方法是我最一开始用的,不行才改成.value的型式的。
不知还有哪些朋友能帮帮我?
To PaPaCong:
那你现在是如何解决这个问题的呢?用字符串连接的方法来构造SQL语句吗?
PaPaCong 2003-03-07
  • 打赏
  • 举报
回复
我也遇到相同的问题,用 hch_45 老兄的方法,还是解决不了。
halfdream 2003-03-05
  • 打赏
  • 举报
回复
关注。
lifanxi 2003-03-05
  • 打赏
  • 举报
回复
一楼的方法好像不行,我实在是菜鸟,不知哪位朋友能再帮帮我?
sunwewillsharedoit 2003-03-05
  • 打赏
  • 举报
回复
UP一下,听课了
itperson 2003-03-04
  • 打赏
  • 举报
回复
clientdataset1.close;
ClientDataSet1.UpdateRecord;
clientdataset1.params[0].value := '会被截断的中文';
clientdataset1.execute;

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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