当前位置:主页>销售管理软件> 列表

关于从中间层返回_RecordSet的问题 找服装管理软件

销售管理软件版1楼: 碰到一个很奇怪的问题:
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: Exception do
ErrText := E.Message;
end;
end;

当客户端使用TDCOMConnection连接时,可以返回正确返回_RecordSet,其代码如下:
ADODataSet1.Recordset := IDispatch(DispConn.AppServer.GetRecordSet(...)) as _RecordSet;
但是,当客户端使用TSocketConnection连接时,使用与上面代码可提示:Interface not supported,转换失败。
似乎使用TSocketConnection连接时,其返回的IDispatch中并不包含接口信息。



有没有哪位大侠也遇到并解决了此问题?

2楼: 没人遇到过这个问题吗?[:(] 如服装管理软件

3楼: 没接触过此类,抱歉,帮不上!

4楼: 没有写过 帮不上

5楼: 参考一下这个帖子:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3326107

6楼: 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封装的。

销售管理软件版7楼: 使用socket连接,
要在server端运行scktsrvr.exe,
通过这个实现socket连接用的接口,
在delphi的bin目录下找这个程序

8楼: 确实不行的,我几年前就遇到过这个问题的.

9楼: TSocketConnection 不支持 _RecordSet 类型数据