不会吧 delphi 6.0 还会犯这么低级的错误(adocommand 不支持中文) (100分)

  • 主题发起人 主题发起人 chshanghai
  • 开始时间 开始时间
to jrq:
也不是什么复杂的方法,就和chshanghai说得一样!简单的执行sql,在profiler里看结果。
用command,query都是一样。
我这里是D6+sqlserver2k.
今天重装了系统,准备在试试!
 
to GanQuan
不知你找到解决的方法没有 希望能跟你交流一下
我查看了一直 adodb 的一些代码
发现 delphi 在创建parameters 时是用了一个pwidestring 转化所有的字符为unicode型
然后用length来得到size的值
并且 adoactiveX 以是根据 size 来定义变量的长度
如果datatype :=ftstring 时 adoactiveX 变为 varchar(size)
例如: 当 value:='江泽民' 时 本来size 为6就对了 但delphi画蛇添足地加了pwidestring
使 size 变成了3 接着 给adoacitveX 付值时 adoactiveX根据size 定义了一个nvarchar(3)的参数

这时就产生了我们所遇到的只能传一个字的现象
但我遇到的问题是
请看下面代码:
var str:string;
begin
str:='your string'+#0 //这里一定要加 #0 如果不加#0 在profile上传递是如像是 七个字符 奇怪的事


//在参数的代码中要写成如下的格式
.....
parambyname('param').datatype:=ftstring;
parambyname('param').size:=length(str); //这句必须要有
......................
end;
因为我对ado activeX 不是太熟. 不知ado activeX在给 parameter.value付值是怎样处理的
希望名位大虾能指点 一 .二

dfw 怎么回事 为什么在输入时 只要按CTRL + SPACE 会员刷新害得我刚才打了那么多全没有了
郁闷...........
 
尽顾着自己瞎试了,才发现王大虾的回帖!
我这里加上参数类型和size那两句就对了。
我的环境Windows2k server(没装补丁), Delphi6(没有update,也没有装ado的升级补丁),sqlserver2000。
重装的系统什么补丁包都没打。加上这两句就行了!
可惜重装之前没有试过,以前打过补丁包的。 :-(
 
to GanQuan
我这里加上 datatype 和size 后 查询的结果是对的
但在 profile中提交的参数值是错的 多了一个字符 必须要加上#0才行

不知你试过没有


 
to chshanghai:
我试过了,提交的参数是正确的,没有多字符。
我想问题可能就如你所说,是转换之后size的问题。我只设置size就可以控制传递的参数值,
dataType设不设都无所谓,parameter的value是以Variant传递的。

 
这个问题我也碰到过,改成这样试试
with adocommand1.Parameters.AddParameter do
begin
name:='vusername';
datatype:=ftstring;
size:=20;
end;

with adocommand1 do begin
commandtext:=' if (select count(*) from tb_user where username=:vusername)>0 '+#13;
commandtext:=commandtext+'print ''ok''';
parameters.parambyname('vusername').value:='江泽民';
execute;
end;


 
to GanQuan
麻烦你帮我试一下下面的代码 with adocommand1 do
begin
commandtext:=' if (select count(*) from tb_user where username=''N''+:vusername)>0 '+#13;
commandtext:=commandtext+'print ''ceng''';
parameters.parambyname('vusername').value:='江泽民';
parameters[0].Size:=length('江泽民');
execute;
end;


我这里执行后 在profile 中显示为: (win98 + (win2000/mssql7))
sp_executesql N' if (select count(*) from tb_user where username=''N''+@P1)>0
print ''ceng''', N'@P1 varchar(6)', '江泽民ER0'

 
分怎么分呢 真的很难 我自已解决了问题却一分没有
 
To chshanghai:
你解決了嗎?怎麼解決的,我給分啊.
 
to xjc_first
你也遇到了吗 解快方法我已写在上面了 你自已仔细看看就知道了
就是如果是string 型的参数时 设置size 就行了
给分. 别忘了给分 . 给分的贴子的id 放在下面就行了
 
To chshanghai:
按你的方法還是不行啊.
 
贴出你的问题 或者代码
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1046502
 
后退
顶部