access程序迁移到sqlserver 2000的问题!(200)

  • 主题发起人 主题发起人 yjlucky
  • 开始时间 开始时间
Y

yjlucky

Unregistered / Unconfirmed
GUEST, unregistred user!
近日将原先的access程序移植到sqlserver 2000发现如下sql语句有问题。sql.Add('select top 10 * from messagelist');sql.Add('where msgtype=:msgtype1 and stcd=:stcd1');sql.Add('and id not in (SELECT top 10 id from messagelist where msgtype=:msgtype2 and stcd=:stcd2 order by id desc)');sql.Add('order by id desc');Parameters.ParamByName('msgtype1').Value := '通知';Parameters.ParamByName('stcd1').Value := '0';Parameters.ParamByName('msgtype2').Value := '通知';Parameters.ParamByName('stcd2').Value := '0';用sql事件查看器发现,运行的是如下语句exec sp_executesql N'select top 10 * from messagelistwhere msgtype=@P1 and stcd=@P2and id not in (SELECT top 10 id from messagelist where msgtype=@P3 and stcd=@P4 order by id desc)order by id desc', N'@P1 nvarchar(10),@P2 nvarchar(1),@P3 varchar(2),@P4 varchar(1)', N'通知', N'0', '通', '0''通知'少了一个'知',这是怎么回事呀? msgtype数据类型为nvarchar(10),stcd数据类型为nvarchar(1)
 
ADO?看看Parameters.ParamByName('msgtype2').Size是多少,Parameters.ParamByName('msgtype2').Datatype是什么。
 
从sql事件查看器来看,应该是数据类型判断错了,是不是ado驱动的问题呀?
 
stcd数据类型为nvarchar(1) 的大小是 1,当然只能放一个字符了。所以就是“通知”,丢了一个“知”啊。
 
检查一下数据类型,好像这2个数据库的部分数据类型不统一,部分函数功能不兼容
 
access->mssql,时间日期型数据,自动增量等要注意
 
又测试了一下,在sql2000中,发现对于简单的sql语句,只操作单表的,ado可以正确认识参数在数据库中的定义,你使用Parameters.ParamByName没有问题。 但是对于复杂的sql语句,尤其是针对多表操作,或参数带某些中文的,ado就不能正确认识参数在数据库中的定义,你使用Parameters.ParamByName就会出错。 就像我这种情况,数据库中我明明定义msgtype的长度是10的,但是ado就认为是2。
 
没人会吗?
 
那你就在赋值前增加一句话:Parameters.ParamByName('msgtype1').size := 10;
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
589
import
I
I
回复
0
查看
843
import
I
后退
顶部