我做了一个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. 现在我正在尝试使用这个wsdl服务,我已经使用了一个导入的wsdl。但当我使用它时,LIke:
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;测试函数返回IMyservice1.TADODataset nad,因此与Data.DB.TADODataset不兼容。请帮帮忙。
发布于 2013-07-31 20:49:08
您不能这样做,因为TADODataSet不能被远程处理,因为它在客户端和服务器上都需要TADOConnection和ConnectionString之类的东西。
使用Delphi删除数据的方法我们使用DataSnap,在服务器端使用一个TSoapDataModule,其中包含一个使用TDataSetProvider从TADODataSet填充的TClientDataSet,在客户端使用一个TSoapConnection加上客户端的TClientDataSet。
然后,DataSnap将使用SOAP (即XML over HTTP)为您执行所有读取/更新流量。
要了解如何设置,请参阅DataSnap videos from Pawel Glowacki,然后阅读Creating multi tiered applications Index上的文档。
请注意,对于DataSnap,您需要将Delphi Enterprise作为最低版本,这不适用于CGI webservices。
另一种解决方案(选择较少,但将数据从服务器端传递到客户端)是将TClientDataSet的内部数据公开为可扩展标记语言,通过CGI Web Service上的方法提供,而不是在客户端将该可扩展标记语言再次放入TClientDataSet中。
我不确定这是否在Delphi许可条款内(他们可能禁止使用TClientDataSet做多层工作),但它应该可以工作。
https://stackoverflow.com/questions/17968164
复制相似问题