谁能解决这个问题,我愿意把所有分数送上(146分),真的很急!!!急!!!我在线等! (99分)

  • 主题发起人 xiao_hero
  • 开始时间
X

xiao_hero

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用COM实现一SQL查询问题,在客户端只需输入SQL语句和一个是否想返回记录集的布尔
标志,即可完成所需的功能。我采用进程内COM服务器模式,定义的方法如下:
function Execute(const sqlstr: WideString;
flag: WordBool): IDispatch;safecall;
与数据库的连接采用ADO方式,因此在Uses中会加上ADODB_TLB,方法具体实现如下:
function Tsqlquery.Execute(const sqlstr: WideString;flag: WordBool): IDispatch;
var
Fconnection:_connection;
Frecordset:_recordset;
begin
Fconnection:=Coconnection.Create;
Fconnection.Open('DSN=testado','','',-1);
Frecordset:=Corecordset.Create;
Frecordset.Open(sqlstr,Fconnection,adOpenDynamic,adLockOptimistic,adCmdText);
if flag=true
then
result:=Frecordset;
end;
现在遇到一个问题,就是方法返回的类型是Idispatch,在客户端我采用olevariant来调用方法,
即为:mysqlqueryvar:=createoleobject('SqlQuerySrv.sqlquery'),mysqlqueryvar声明为
olevariant,然后执行mysqlqueryvar.Execute(sqlstring,true),这个返回的是olevariant
而现在我想要返回的是记录集类型,即为_recordset,因为我想要调用记录集中的数据。注意
我这里要必须采用olevariant来调用方法,比如采用接口不行,如:mysqlqurey:=Cosqlquery.create
as Isqlquery,myrecordset:=mysqlquery.execute(sqlstring,true) as _recordset,我知道
这个是可以的,但现在我必须要采用olevariant!请问该如何解决呢?急盼答复!!!
 
孩子,你真可怜,我帮你提前吧。
 
_recordset 不就是一个记录集,
你想返回什么样的类型 .
 
我当然想返回一个记录集类型,但是COM自动化服务器所支持的类型中没有记录集这种类型,
所以我改用返回Idispatch类型,但是在客户端却是类型不匹配,怎么办呢?
 
客户端没有_RecordSet,可是有IUnKnown呀。
在客户端接收时可以这样写:
ADOSomething.RecordSet := IUnKnown(DCOM.Appserver.MethodX) as _RecordSet
 
应该是服务器端没有_RecordSet,可是有IUnKnown呀。
 
非常感谢!看到weic兄画龙点睛般的提示,小弟顿时恍然大悟,就是在客户端调用时将Iunknown
或是Idispatch借口转化成_recordset记录集类型,这样就简单搞定,还是小弟经验不足呀。
另外还想请教各位高手,我想编写的这个SQL查询组件,在访问数据库方面还有什么更好的方法吗?
就是除了ADO外,还有别的更好的方法吗?另外对于小弟的整个设计思路,您还有什么意见吗?
weic兄的提示分,小弟马上就会送上。
 
使用ADO当然是最好的方法了,应该是最有发展的,在MS框架内。
至于在客户端写SQL,似乎不是很合适的方法;但是如果SQL变化很大,也没有什么好办法。
 
为什么不合适呢?我们要在客户端执行所需的各样功能,就要写出各种各样的SQL语句。但是我感觉
自己用COM编写出来的SQL组件,与Delphi中提供的TQuery控件还是有一定的差距,所以还有很多事要做。
 
用OleVaRiant
例子:
unit Unit2;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
Windows,Dialogs, adodb,ActiveX, Classes, ComObj, PrtA_TLB, StdVcl;
type
TZComTmd = class(TTypedComObject, IZComTmd)
protected
function Method1(var sndRst: OleVariant): HResult;
stdcall;
{Declare IZComTmd methods here}
end;

implementation
uses ComServ,Unit1;
function TZComTmd.Method1(var sndRst: OleVariant): HResult;
begin
//form1.Visible:=false;
form1.label1.caption:=sndrst.recordcount;
end;

initialization
TTypedComObjectFactory.Create(ComServer, TZComTmd, Class_ZComTmd,
ciMultiInstance, tmApartment);
end.

VB调用:
Dim dd As New ZComTmd
Private Sub Command1_Click()
dd.Method1 Me.Adodc1.Recordset
End Sub
给分!!!!!!!!!!!!!!!!!!!!!!
 
满意吗???????????????????
 
如果是用vc6.0返回类型Idispatch的指针,delphi客户端如何接呢?
 
例子:
procedure TForm1.Button1Click(Sender: TObject);
var
myCom:OleVaRiant;
begin
//'zbhDbVis.zbhDbVisit'是用VB写的Com组件,
myCom:=createoleobject('zbhDbVis.zbhDbVisit');
//myCom.
end;
 
我要问一下:
在VB中,可用Set myCom=nothing
但是在Delphi中怎样释放用CreateOleObject()创建的Com对象那????
 
类型为OleVaRiant的变量用什么显示为表格?就能和ClientDataSet接provider传回的数据集那样操作。
 

var
myCom:OleVaRiant;
begin
begin
//TestMethod是用Vc写的Com组件,返回类型Idispatch的指针
myCom:=DCOMConnection1.AppServer.TestMethod;(在dephi中调用TestMethod方法)
//myCom.
end;
 
类型为OleVaRiant的数据集如何操作
 
顶部