关于从中间层返回_RecordSet的问题(300分)

  • 主题发起人 主题发起人 特尔斐
  • 开始时间 开始时间

特尔斐

Unregistered / Unconfirmed
GUEST, unregistred user!
碰到一个很奇怪的问题:
COM+组件中的一个方法,其主要代码如下:
function TCoDataTransport.GetRecordSet(const DBIniSect,
SQLText: WideString;
var ErrText: WideString): IDispatch;
var
rs: Recordset;
con: Connection;
begin
try
con := CoConnection.Create;
con.Open(GetConnString(DBIniSect), '', '', adConnectUnspecified);
rs := CoRecordset.Create;
rs.CursorLocation := adUseClient;
rs.Open(SQLText, con, adOpenDynamic, adLockReadOnly, adCmdText);
rs.Set_ActiveConnection(nil);
Result := rs;

ErrText := '';
except
on E: Exceptiondo
ErrText := E.Message;
end;
end;

当客户端使用TDCOMConnection连接时,可以返回正确返回_RecordSet,其代码如下:
ADODataSet1.Recordset := IDispatch(DispConn.AppServer.GetRecordSet(...)) as _RecordSet;
但是,当客户端使用TSocketConnection连接时,使用与上面代码可提示:Interface not supported,转换失败。
似乎使用TSocketConnection连接时,其返回的IDispatch中并不包含接口信息。
有没有哪位大侠也遇到并解决了此问题?
 
没人遇到过这个问题吗?[:(]
 
没接触过此类,抱歉,帮不上!
 
没有写过 帮不上
 
参考一下这个帖子:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3326107
 
thx1180给的链接并不能解决我的问题哦。下面是我客户端测试单元中的代码:
procedure TForm1.btnExecuteDataSetClick(Sender: TObject);
var
sErr: WideString;
IDisp: ICoDataTransportDisp;
IDispRS: IDispatch;
begin
ADODataSet1.Close;
SocketConnection1.Open;
IDisp := ICoDataTransportDisp(IDispatch(SocketConnection1.AppServer));
//DCOMConnection1.Open;
//IDisp := ICoDataTransportDisp(IDispatch(DCOMConnection1.AppServer));
IDispRS := IDisp.GetRecordSet(edtDBIniSect.Text, edtSQLText.Text, sErr);
if sErr = '' then
ADODataSet1.Recordset := IDispRS as Recordset;
// 这一行在Socket连接时出错
SocketConnection1.Close;
//DCOMConnection1.Close;
end;

上面的代码中使用的是Socket连接,注释掉的几行是使用DCOM连接。
如果使用DCOM连接,则没有任何问题,可以正确返回RecordSet;但如果使用Socket连接,则会出现“接口不支持”的错误,也就是在IDispRS as Recordset处出错,但DCOM方式就可以成功转换。故怀疑Socket连接返回的IDispatch并不包含RecordSet的接口信息,虽然它在服务端是以RecordSet封装的。
 
使用socket连接,
要在server端运行scktsrvr.exe,
通过这个实现socket连接用的接口,
在delphi的bin目录下找这个程序
 
确实不行的,我几年前就遇到过这个问题的.
 
TSocketConnection 不支持 _RecordSet 类型数据
 
后退
顶部