发现 Delphi2009 鼓吹的三层系统重大的BUG..(200)

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

yeszhang

Unregistered / Unconfirmed
GUEST, unregistred user!
使用李维 网上普遍的Delphi 2009 Datasnap 游记编写的测试三层..服务器端使用 TSampleDataset 或者TSqlDataSet 打开数据集并用TDataset类型传给客户端.客户端用SqlServerMethod 执行服务器方法,并接收 传来的 TDataset.并打开数据集.测试发现很多SQL 执行后传过来 客户端都会 莫名其妙地出现一些问题.后来跟踪了一下.怎么也找不出问题来..我就先将服务器打开后的数据报错为XML文档.并在客户端接收到TDataset后也保存为文档.我想以此来对比一下:发现只要服务器的TSampleDataset 或者TSqlDataSet SaveToFile 就是保存为XML文档,只要此文档能被IE正确打开就能正确传到客户端并正确读取.但是却有好多数据集经服务器的TSampleDataset 或者TSqlDataSet Open后.并SavetoFile使用IE并不能正确打开.比如我在客户端发送一个简单的SQL给服务器:select DISTINCT(F_Name+'',''+F_CompanyNo) as StoreName from T_Company服务的TSqlDataSet.Open后传过来后却莫名奇妙错误.我在服务器端使用 TSqlDataSet.Savetofile保存为XML文档.发现此XML文档不能被IE打开:<?xml version="1.0" standalone="yes"?> <DATAPACKET Version="2.0"><METADATA><FIELDS><FIELD attrname="StoreName" fieldtype="string" WIDTH="131"/></FIELDS><PARAMS LCID="0"/></METADATA><ROWDATA><ROW StoreName="庞学制管青浦厂区,COM061103153023"/></ROWDATA></DATAPACKET>也就是这个在服务器的TSqlDataSet.Open后将TDataset传给客户端时.就报错.客户端接收后保存为XML文档发现被传改成:<?xml version="1.0" standalone="yes"?> <DATAPACKET Version="2.0"><METADATA><FIELDS><FIELD attrname="F_Values" fieldtype="string.uni" required="true" WIDTH="202"/></FIELDS><PARAMS LCID="0"/></METADATA><ROWDATA><ROW F_Values="&#24222;&#23398;&#21046;&#31649;&#38738;&#28006;&#21378;&#21306;,COM061103153023"/></ROWDATA></DATAPACKET>妈妈的把字段名都给改掉了...而且很多这样的情况,服务器的TSqlDataSet 能打开数据集.传给客户端就使用TDataset来接收就报错.
 
了解了~~
 
还没怎么用2009是不是开发人员不足啊
 
应该是你的程序有问题吧,这样的弱智bug不会有的吧,呵呵。
 
F_Values很像是你的字段的命名风格,你有没有字段是这个名称的?
 
我也怀疑我的程序有问题,可是程序很简单.没有多余的数据.服务器:SqlDataSet.CommandText:='select DISTINCT(F_Name+'',''+F_CompanyNo) as StoreName from T_Company';SqlDataSet.Open;SqlDataSet.SaveToFile('test.xml');Result:=SqlDataSet;客户端:TSqlConnection设置Driver为DataSnap并设置好参数.确认能连接到服务器.SqlMethod.连接TSqlConnection,并设置服务器方法.使用TDataSetProvider连接它用ClientDataSet连接DataSetProvider.并执行Open后.Savetofile很简单的过程.而且我如果客户端传入简单的比如Select * from T_Company,不管是服务器还是客户端都很正常连接并能打开.两端Savetofile的XML文档均能被IE正常打开.
 
诸位如有不信,我在上海,你可以来我公司或者我们找个地方测试测试这个问题..我奉送打车费200.呵呵.我现在是急得不行v因为程序有一部分已经改为三层了.下面技术人员说很多SQL服务器执行返回都不正确或者抛出错误.我也大骂过他们后拿来自己搞.发现问题不是那么简单v才从网上抄李维的代码,做个简单demo来测试一下的..没想到发现这么个大问题....
 
F_Values 不是我的数据库的字段.确实是自动生成的..'select DISTINCT(F_Name+'',''+F_CompanyNo) as StoreName from T_Company';这么简单的SQL也不会产生F_Values这个字段啊?诸位如果测试的时候,一定要记得F_Name为中文内容.F_CompanyNo为英文字符串..我原有你一样的想法v呵呵.后来写了一个更加复杂的SQL让服务器执行.如下:declare @sql varchar(8000)set @sql=''select @sql=@sql+'sum(case dbo.num_h(F_Specs,F_Material) when '''+ aa +''' then F_StoreNumber end) as '''+aa+''','from ( select distinct dbo.num_h(F_Specs,F_Material) as aa from v_PtStore WHERE (dbo.v_PtStore.F_PtNo IN (SELECT dbo.v_AllFieldInStore.F_PtNo FROM dbo.v_AllFieldInStore WHERE (dbo.v_AllFieldInStore.F_Type = '管材') )) AND (F_StoreNumber <> 0) and (dbo.v_PtStore.F_StoreNo='COM070531103158') ) a select @sql='select dbo.num_l(F_Specs) as 外径 ,''汇总'' as 汇总, dbo.rtPtType(dbo.num_l(F_Specs)) as 不锈钢管型 ,' +left(@sql,len(@sql)-1 ) +'from v_PtStore WHERE (dbo.v_PtStore.F_PtNo IN (SELECT dbo.v_AllFieldInStore.F_PtNo FROM dbo.v_AllFieldInStore WHERE (dbo.v_AllFieldInStore.F_Type = ''管材'') )) AND (F_StoreNumber <> 0) and (dbo.v_PtStore.F_StoreNo=''COM070531103158'') group by dbo.num_l(F_Specs),dbo.rtPtType(dbo.num_l(F_Specs)) order by dbo.num_l(F_Specs)' exec( @sql)没想到那么多字段.客户端执行服务器方法,并打开服务器返回的Dataset后.只有一个字段值:也是字段名被改为F_Values客户端的Clientdataset.Savetofile后的文件:<?xml version="1.0" standalone="yes"?> <DATAPACKET Version="2.0"><METADATA><FIELDS><FIELD attrname="F_Values" fieldtype="string.uni" required="true" WIDTH="202"/></FIELDS><PARAMS LCID="0"/></METADATA><ROWDATA><ROW F_Values="10*10"/><ROW F_Values="10*20"/><ROW F_Values="10*25"/><ROW F_Values="100*100"/><ROW F_Values="101.6"/><ROW F_Values="108"/><ROW F_Values="114"/><ROW F_Values="12.5*12.5"/><ROW F_Values="12.7"/><ROW F_Values="127"/><ROW F_Values="13*25"/><ROW F_Values="133"/><ROW F_Values="14*24"/><ROW F_Values="141"/><ROW F_Values="15*15"/><ROW F_Values="15*30"/><ROW F_Values="15.9"/><ROW F_Values="159"/><ROW F_Values="19*19"/><ROW F_Values="19.05"/><ROW F_Values="20*40"/><ROW F_Values="22*22"/><ROW F_Values="22.2"/><ROW F_Values="25"/><ROW F_Values="25*25"/><ROW F_Values="25*38"/><ROW F_Values="25*50"/><ROW F_Values="25.4"/><ROW F_Values="28"/><ROW F_Values="30"/><ROW F_Values="30*30"/><ROW F_Values="30*60"/><ROW F_Values="31.8"/><ROW F_Values="35*35"/><ROW F_Values="38*38"/><ROW F_Values="38.1"/><ROW F_Values="40"/><ROW F_Values="40*40"/><ROW F_Values="40*60"/><ROW F_Values="40*80"/><ROW F_Values="41.3"/><ROW F_Values="45"/><ROW F_Values="45*75"/><ROW F_Values="45*95"/><ROW F_Values="50"/><ROW F_Values="50*100"/><ROW F_Values="50*50"/><ROW F_Values="50.8"/><ROW F_Values="57"/><ROW F_Values="60"/><ROW F_Values="60*60"/><ROW F_Values="63.5"/><ROW F_Values="70"/><ROW F_Values="70*70"/><ROW F_Values="76.2"/><ROW F_Values="80"/><ROW F_Values="80*80"/><ROW F_Values="82.5"/><ROW F_Values="88.9"/><ROW F_Values="89"/><ROW F_Values="9.5"/></ROWDATA></DATAPACKET>
 
说明下:确实很多的SQL让服务器执行并能正确返回.你可以测试用'select DISTINCT(F_Name+'',''+F_CompanyNo) as StoreName from T_Company';并且字段中英文混合.一定要中英文混合.否则不会错.比如F_Name中文.F_CompanyNo为英文.使用DISTINCT后传给客户端.你OPEN用DBGrid显示或者Savetofile .你试试看.
 
返回DATASET,我还不敢用,调用函数我一直在用。感觉还行。
 
据说Datasnap返回的数据集都将被弄成XML后.客户端接受这个xml集.如果真是这样那可能就不难理解.如果服务器端Dataset打开后保存为XML文档.这个文档被封装时就存在问题.那就导致客户端解析这个XML文档就错误了.关键是服务器将Dataset封装为XML文档这个过程不是我们能干预得了的啊..郁闷.
 
除非我们在将服务器不返回Dataset .我们返回String.然后自己定义格式.让客户端来解析.那有的烦了..
 
delphi2009 12.0.3370.20184 试试这个版本
 
呵呵,你还没测试过就做,很了不起。我曾经有个dcom的想改成这种方式,发现有些数据类型走不通,我都放弃了,如果你的字段类型全部是varchar的,是没有问题的
 
是啊.原来小数的传过来或者包括Image类型传都有问题.整了我很长时间都没搞出来.我数据库大部分字段类型都是varchar.这么大的问题怎么会没见易博龙给出个方案呢?难道他们又声称支持Unicode的都没经过什么测试?跟我公司一样写好了就扔给客户?嗬嗬嗬嗬..
 
但至少我们公司如果鼓吹的引以为豪的功能点.一定做得很优化.哈哈有人碰到过或者有心人去测试吗?看看是不是我有某些地方设置不对或者Delphi的版本修正了?
 
有沒有用正版的Delphi啊
 
说句老实话,你用这种方式来做三层,效率很低,速度很慢,所以没有什么可以引以为豪的
 
TO,psynet123,有好的方式可以给点意见啊v... 谢谢
 
多人接受答案了。
 
后退
顶部