在一个项目中,使用delphi来开发客户端+webservice结构的程序,客户端和服务端都由delphi制作。其中有个模块,要求服务端返回一个数据集,而这个数据集是在服务端通过对数据库中多个表格的数据进行复杂分析之后得到的一个数据集,而且这个数据集(视图)在数据库中没有对应的表进行存储(为什么?因为这个模块根据不同客户的需求,展示出来的分析结果的结构不同,如果要在数据库中对应一个表,那每次为不同客户部署都要对数据库进行修改,这个是不可接受的)。
    我的思路是这样的,在分析开始之初,先根据要求返回的格式,通过ADOQUERY创建一个视图,sql语句如下:
select 1 as fld1,'' as fld2
然后在分析的时候,根据不同的步骤,往不同的字段里面插入数据,当然这个视图里面有其他的字段用来定位,每次修改字段的时候的语句如下:  ADOQry1.Append;
  ADOQry1.FieldByName('fld1').AsInteger := StrToInt(edt1.Text);
  ADOQry1.FieldByName('fld2').AsString := edt2.Text;
  //ADOQry1.Post;  现在的问题出来了,如果不执行post,我用dbgrid查看结果的时候发现,所有加进去的值都是空的,但是执行post明显不可能,因为没有实际的数据表和这个视图进行对应,没有办法更新。请教高手,这种问题是否有办法解决?为什么一定要用ADOQurey呢?因为delphi写的webservice返回数据集要通过ClientDataSet.XMLData的方法,返回一个widestring,客户端再把这个widestring转换成数据集,现在我知道的可行方案只能把ClientDataSet和ADOQurey绑定,这样才能把ADOQurey中的数据全部拷贝到ClientDataSet中。是否有其他的办法我不知道,还请各位高手赐教~~~跪求,在线等~~~

解决方案 »

  1.   

    你的 ADOQry1.FieldByName('fld1').AsInteger := StrToInt(edt1.Text);
      ADOQry1.FieldByName('fld2').AsString := edt2.Text;
    需要保存么?可以在stringgrid 上先显示。需要处理的话再处理好了
      

  2.   

    我好像一直就是这么做的,只是以ini替代了xml
    但是,我只是提供只读的浏览(类似clientdataset的内存表+dbgrid)
    要增删改,则自动生成sql传递到应用服务器,由它代为执行
      

  3.   

    感谢大家!当天提问之后,重新梳理程序流程,发现反正最后都要把ADOQuery中的数据集拷到ClientDataSet中,那为啥不一开始就把空的结构拷到ClientDataSet中,然后直接在这个里面修改呢,做了个小程序验证了一下,果然可行,看了一下大家的回答,貌似sz_haitao和hys_427提到的内存表很靠谱呢呵呵,也要感谢taiguang和kampan的参与,这次分数见者有份啦!ps,这几天一忙就把结贴的事情给忘了,真不好意思