0

我已经做了一个 cgi web 服务。代码如下:

unit MyServicesImpl;

interface

uses Soap.InvokeRegistry, System.Types, Soap.XSBuiltIns, MyServicesIntf,
  Data.DB,
  Data.SqlExpr, SQLConnection1, Data.Win.ADODB;

type
  { TMyServices }
  TMyServices = class(TInvokableClass, IMyServices)
  public
    function TestFunction(): TADODataSet; stdcall;
  end;

var
  ConnString: string;
  objTADOQuery: TADOQuery;
  objTSQLDS: TDataSource;
  objDS: TADODataSet;
  objTable :TADOTable;

implementation


function TMyServices.TestFunction: TADODataSet;
var
  objTSQLConnection1: TADOConnection;
var
  conStr: string;
begin

  objTSQLConnection1 := TADOConnection.Create(nil);
  conStr := 'Provider=sqloledb;' + 'Data Source=Kays-serv64-01;' +
    'Initial Catalog=Test;' + 'User Id=sa;Password=Kays@India';
  objTSQLConnection1.ConnectionString := conStr;
  objTSQLConnection1.LoginPrompt := False;

  objTSQLConnection1.Connected := True;

  if (objTSQLConnection1.Connected) then
  begin
    objTADOQuery := TADOQuery.Create(nil);
    objTSQLDS := TDataSource.Create(nil);
    objDS:= TADODataSet.Create(nil);
    objTable:= TADOTable.Create(nil);
    objTable.TableName:='expediads';
    objTADOQuery.Connection := objTSQLConnection1;
    objTADOQuery.SQL.Text := 'select * from expediads';
    objTADOQuery.Prepared := True;
    objTADOQuery.Active := True;
    objTSQLDS.DataSet := objTADOQuery;
    objDS.DataSource:=objTSQLDS;
    Result := objDS;
  end
  else
  begin
    Result := objDS;
  end;
end;

initialization

{ Invokable classes must be registered }
InvRegistry.RegisterInvokableClass(TMyServices);

end. 

现在我正在尝试使用这个 web 服务,我使用了一个导入的 wsdl。但是当我像这样使用它时:

Procedure TForm3.TestFunction;
var
  vMyService: IMyServices;
var
  objDataSource: TDataSource;
var
  objNewDS: IMyServices1.TADODataSet;
  var
  objTSQLConnection1: TADOConnection;
var
  conStr: string;
begin

  vMyService := GetIMyServices;
  objNewDS :=vMyService.TestFunction();
  end;

Test 函数返回 IMyservice1.TADODataset nad,因此与 Data.DB.TADODataset 不兼容。请帮忙。

4

1 回答 1

1

你不能这样做,因为TADODataSet它不能被远程,因为它需要在客户端和服务器上TADOConnection这样ConnectionString的东西。

使用 Delphi 删除数据的方法,我们使用DataSnapTSoapDataModule在服务器端使用 a ,其中包含从使用 aTClientDataSet填充的a ,在客户端使用 a plus在客户端。TADODataSetTDataSetProviderTSoapConnectionTClientDataSet

然后,DataSnap 将使用 SOAP(即 XML over HTTP)为您执行所有读取/更新流量。

请参阅Pawel Glowacki 的 DataSnap 视频以了解如何设置它,然后阅读创建多层应用程序索引中的文档。

请注意,对于 DataSnap,您需要将 Delphi Enterprise 作为最低版本,这不适用于 CGI Web 服务。

另一种解决方案(更少的选项,但从服务器到客户端获取数据)是将TClientDataSet的内部数据公开为 XML,通过 CGI Web 服务上的方法提供,而不是在客户端将该 XML 放入再次TClientDataSet

我不确定这是否在 Delphi 许可条款范围内(他们可能禁止TClientDataSet用于进行多层工作),但它应该可以工作。

于 2013-07-31T12:49:08.297 回答