运行程序老出现莫名其妙的错误,请高手指点!(200分)

  • 主题发起人 主题发起人 lyunp
  • 开始时间 开始时间
L

lyunp

Unregistered / Unconfirmed
GUEST, unregistred user!
我做的3层结构,数据库是sql server 2000 运行总出现invalid data packet,请问各位高手怎么解决?
 
原因太多了,我经常碰到的出现invalid data packet可能有以下情况,希望有用。<br>1、ClientDataSet在Filtered为True时,又给ClientDataSet赋数据包。<br>2、ClientDataSet在设计过程中增加了字段,但在运行时所赋数据包字段与设计时的不同。<br>3、取数据包的Sql语句中没有列名或列名有相同的名字。<br>等等
 
多半是服务器端数据表结构改变了,相应客户端数据控件设置没有做相应变动。
 
Andyli 能不能在详细在全面点,谢谢
 
你这个应该是发送去的数据的格式与数据库中存储表的格式不一致,用断点调试哈发送出去的数据包里的数据的格式是不是和数据库的一致。也可能是发送的包格式不对,接收端识别不了你发送的包。
 
我的问题没解决呀!!!!!
 
问题再说清楚一点,是什么时候出现的“invalid data packet”这个错误,是提交数据包更新资料时,还是取资料后给ClientDataset赋数据包时。<br>如是更新时出错,你可用SQL的事件探测器探测出错时SQL到底执行的是什么语句,将探测器探测到的语句在查询分析器执行一下就知道那里出错了。最常见的错误就是两人同时更新一条记录,后提交的会报错。
 
str:=''<br>+'declare @T table'<br>+'('<br>+' yf tinyint,'<br>+' nd1 money,'<br>+' nd2 money'<br>+');'<br>+'declare'<br>+' @nd int,'<br>+' @yf int,'<br>+' @i tinyint,'<br>+' &nbsp;@Cdate datetime,'<br>+' &nbsp;@Cdate1 datetime,'<br>+' @yfksrq tinyint,'<br>+' @yfjsrq tinyint;'<br>+'set @Cdate='+quotedstr(cxDateEdit1.Text)+';'<br>+'set @nd=year(@Cdate)-1;'<br>+'set @yf=month(getdate());'<br>+'select @yfksrq=yfksrq,@yfjsrq=yfjsrq from xtxxb;'<br>+'if (month(getdate())=12 and day(getdate())&gt;@yfksrq)'<br>+' set @nd=year(getdate());'<br>+'set @i=1;'<br>+'while @i&lt;=12 '<br>+'begin'<br>+' set @Cdate1=dateadd(month,-1,cast(cast(year(dateadd(year,-1,@Cdate)) as char(4))+'+quotedstr('-')+'+cast(@i as varchar(2))+'+quotedstr('-')+'+cast(@yfksrq as varchar(2)) as datetime));'<br>+' insert @T (yf) values(@i);'<br>+' update @T set nd1=je from (select @i as yf1,sum(hkje) as je from hkzb b where '<br><br>&nbsp; +' b.hkrq&gt;=cast(year(@Cdate1) as char(4))+'+quotedstr('-')+'+cast(month(@cdate1) as varchar(2))+'+quotedstr('-')+'+cast(day(@cdate1) as varchar(2))'<br>&nbsp; +' and b.hkrq&lt;=cast(year(dateadd(year,-1,@Cdate)) as char(4))+'+quotedstr('-')+'+cast(@i as varchar(2))+'+quotedstr('-')+'+cast(@yfjsrq as varchar(2))'<br><br>&nbsp; +fs+qx+tj+') a where a.yf1=yf;'<br>+' set @i=@i+1;'<br>+'end;'<br><br>+'set @i=1;'<br>+'if year(getdate())&gt;year(@Cdate) set @yf=12;'<br>+'while @i&lt;=@yf '<br>+'begin'<br>+' set @Cdate1=dateadd(month,-1,cast(cast(year(@Cdate) as char(4))+'+quotedstr('-')+'+cast(@i as varchar(2))+'+quotedstr('-')+'+cast(@yfksrq as varchar(2)) as datetime));'<br>+' update @T set nd2=a.fhsl from (select @i as yf1,sum(b.hkje) as fhsl'<br>+' from hkzb b'<br>+' where '<br><br>&nbsp; +' b.hkrq&gt;=cast(year(@Cdate1) as char(4))+'+quotedstr('-')+'+cast(month(@cdate1) as varchar(2))+'+quotedstr('-')+'+cast(day(@cdate1) as varchar(2))'<br>&nbsp; +' and b.hkrq&lt;=cast(year(@Cdate) as char(4))+'+quotedstr('-')+'+cast(@i as varchar(2))+'+quotedstr('-')+'+cast(@yfjsrq as varchar(2))'<br>+fs+qx+tj+' ) a'<br>+' where a.yf1=yf;'<br>+' set @i=@i+1;'<br>+'end;'<br>+' insert @T (yf,nd1,nd2) values(13,@nd,@nd+1);'<br>+'update @T set nd1=0 where nd1 is null;'<br>+'update @T set nd2=0 where nd2 is null and yf&lt;=@yf;'<br>+'select * from @T;';<br>with LineCDS do<br>begin<br>&nbsp; Close;<br>&nbsp; CommandText:=str;<br>&nbsp; Open;<br>end;<br>看看代码吧,执行Open就出这个错误了。
 
其中fs,qx,tj是根据实际操作变化的条件
 
1、中间层的DataSetProvider的poAllowCommandText设为True,李维的书中有讲。<br>2、SQL代码前加多 SET NOCOUNT ON
 
poAllowCommandText我设为true 的,SET NOCOUNT ON &nbsp;也实验了,还是不行!!!!!
 
这个代码是我1年前写的,当时没问题,现在运行就不行了!!!!!!
 
是不是用了SOCKET连接服务端没有启用:scktsrvr.exe
 
我没用socket!
 
再看看 LineCDS 的RemoteServer和ProfiderName两个属性有没有设?<br>执行语句之前,中间层与数据库的连接是否为Open?<br>SQL语句在查询分析器中是否能顺利执行?<br><br>要是这都没问题的话,那就真不知道是什么原因了。
 
两个属性都设置了,在查询分析器中也没问题,中间层的组件是我新加的,不是打开的!!!!
 
我用的是ADO和ADO的组设置有关系吗???
 
以前运行好好的,现在你加了中间层就出问题,看来是你的新组件的问题,跟踪一下。
 
可能是设定有问题,因该是连接的问题,自己调调就OK了。----------再问一下表结构有没有变动过,比如字段类型啊,相关字段的增减啊。<br>另外看了你的代码(你用的是传SQL的形式,这样中间层硬编码时花的时间会比较长),给你一个建议吧,客户端和中间层尽量用传参数据的形式,这样会获得较大的执行效率
 
我重装了下系统OK了,但不知道为什么,谁能给分析下??
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
948
import
I
后退
顶部