2013-07-31 17 views
0

我已經做了一個cgi web服務。代碼如下:如何通過在delphi VLC中通過delphi webservice返回編碼來消費TDatasource組件

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;[email protected]'; 
    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; 

測試功能,因此返回IMyservice1.TADODataset NAD不兼容Data.DB.TADODataset。請幫忙。

+0

剛剛宣佈objNewDS作爲TADODataset – whosrdaddy

+0

[dcc32錯誤] Unit3.pas(63):E2010不兼容的類型: 'Data.Win.ADODB.TADODataSet' 和 'IMyServices1.TADODataSet' 當我宣佈它,因爲我得到這個錯誤TADODataset。 –

+0

恐怕不可能在這裏嘗試做什麼。不要嘗試發送TADODataset,但底層數據(類似於數組左右) – whosrdaddy

回答

1

你不能這樣做,因爲TADODataSet不能遠程的,因爲這將需要在客戶端和服務器上的TADOConnection和這樣的事情一樣ConnectionString

,以消除含有TClientDataSet此方法從TADODataSet使用TDataSetProvider填充在服務器端採用Delphi使用我們與DataSnap一個TSoapDataModule數據的方式,以及在客戶端上一個TSoapConnectionTClientDataSet在客戶端上。

然後DataSnap將使用SOAP(即基於HTTP的XML)爲您執行所有讀取/更新流量。

查看DataSnap videos from Pawel Glowacki瞭解如何設置,然後閱讀文檔Creating multi tiered applications Index

請注意,對於DataSnap,您需要將Delphi Enterprise作爲最低版本,並且這不適用於CGI Web服務。

另一種解決方案(選項較少,但將數據從服務器獲取到客戶端)是將TClientDataSet的內部數據公開爲XML,通過CGI Web Service上的方法提供,而不是客戶端上的方再次將該XML放入TClientDataSet

我不確定這是否符合德爾福許可條款(他們可能會禁止使用TClientDataSet進行多層工作),但它應該有效。

+0

這很好,但請您詳細說明一點,因爲我對這項技術很陌生。 –

+2

爲了闡述,答案會變得很長。你應該看我提到的視頻。這是更快,也許更清楚(: –

相關問題