我在COM里生成了一个TADOQuery控件
现在我调用的程序里有个TDataSource1控件,
现在我希望能将COM里的TADOQuery控件赋值给DataSource1.DataSet里,该怎么做?

解决方案 »

  1.   

    我也正在做些类似的开发,建议:
    编写一个新的TDataset类,将COM中TAdoQuery的接口包装起来
      

  2.   

    如果没有理解错的话,你是想把com中的TAdoQuery 直接传给调用者client直接使用?
    跨进程的传递这个应该是不行的,因为不同的进程内存区域都不同,很难搞定。可以在com用自己的接口把这个TadoQuery你用到的操作包装起来,然后供client调用即可。简单的说是这样,需要注意的事情还很多……
      

  3.   

    To xuantian2002 (菜鸟): 
        坦白地说,我感觉你的思路有问题。使用COM是一种典型的多层分布式架构系统的解决方案,所以你在设计系统的时候就必须抛弃以往的R&D的许多设计手段。
        不要误解我的意思,我不是说你不能使用WYSIWYG(What You See Is What You Get)的实现手段,不能使用Delphi提供的强大的组件体系。而是说,你在设计的时候必须采用分层和UI Layer与Business Layer完全分离的方式与手法。
        就你的问题而言,其实不难,我知道三种解决方案。不过不管是哪一种,其相同之处有以下两点:
        1. 三种方式都是先将服务器端的COM组件开发完成并系统注册后再开发客户端程序;
        2. 三种方式的客户端程序中TDataSource组件的DataSet属性设置的都为一个TClientDataSet组件,这是至关重要的。其中的原因,你可以自己去想想。这样当TClientDataSet组件获得数据后,你可以操作这个本地内存数据集,而当数据需要修改的时候你也可以使用它进行更新操作。具体事项请参见相关书籍,不过需要你有一定的基础才能理解。
        3. 下面我来说说三种方案,只是简单的描述:
        3.1 使用TRemoteDataModule组件,服务器端使用TDataSetProvider组件,它前连客户端的TClientDataSet组件,后接TRemoteDataModule的TADOQuery组件;在实现了服务器端COM组件并注册成功后,你可以在客户端程序中设置TClientDataSet组件的ProviderName属性为服务器端的TDataSetProvider组件。
        3.2 与上者的DataSnap开发方法(原来称为MIDAS)不同,第二种方法是纯粹地使用COM的开发方法,即在你自己设计的CoClass的某个接口中实现数据的获取、传递与更新的工作(而不是借助Delphi帮助你产生的解决方案)。同样可以使用TDataSetProvider组件,不过这个时候你必须自己考虑如何在接口的方法中使用TDataSetProvider组件进行一系列的数据操作。
        3.3 你可以使用dbExpress数据存取引擎完成与前两者相同的功能,但是我想你可能想要继续使用ADO的数据存取引擎,所以第三种方法就不赘述了。
        总之,你必须改变既往的系统设计与实现的思想与方式,以一种全新的客户机/服务器(不要和C/S体系架构混为一谈,这里的服务器指的是Business Layer,不是数据库服务器)的思想与方式去思考和解决问题,再找一些Delphi有关这个方面的内容推敲一下。记住,TClientDataSet组件在MTS/COM+的应用中必不可少(当然是用在客户端程序中)。
      

  4.   

    源与数据集之间之间连接是指针,而COM和类一样是用来封装函数,过程,与属性的,很难搞同意 boatzm(晓舟怕麻烦)的看法,自己封装它
      

  5.   

    嘿嘿,搞定了,谢谢大家的提示,不过可能我的问题表达错了
    我是想在一个单机版的程序里,做个公用的查询COM,大家都调用这个COM,实现查询,再将返回的查询通过DataSource1显示在DBGRID里。