4

インプロセスのDataSnapアプリケーションでサーバーメソッドにアクセスできます。詳細はこちらをクリックしてください。

ただし、インプロセスデータスナップアプリケーションには別の側面があります。これは、IAppServerまたはTDataSetProviderです。

Delphi 2009より前は、インプロセスデータスナップアクセスにTLocalConnectionでTConnectionBrokerを使用していました。新しいDelphi2009/2010DataSnapを使用すると、TDSProviderConnectionをRemoteServerとして使用できます。ただし、TCP/HTTP接続でのみ機能させることができます。インプロセスデータスナップアプリケーションにTDSProviderConnectionを使用できません。「無効なポインタ操作」を促すメッセージが表示されます。

これは私のコードがどのように見えるかです:

var o: TDataModule1;
    Q: TSQLConnection;
    c: TEmployeeServerClient;
begin
  o := TDataModule1.Create(Self); 
  Q := TSQLConnection.Create(Self);
  try
    Q.DriverName := 'DSServer1';
    Q.LoginPrompt := False;
    Q.Open;

    DSProviderConnection1.SQLConnection := Q;
    DSProviderConnection1.ServerClassName := 'TEmployeeServer';
    DSProviderConnection1.Connected := True;

    ClientDataSet1.ProviderName := 'DataSetProvider1';
    ClientDataSet1.Open;
  finally
    o.Free;
    Q.Free;
  end;
end;

TEmployeeServerは、相互に接続するTDataSetProvider、TSQLDataSet、およびTSQLConnectionで構成されるTDSServerModuleクラスの子孫です。

ソースコードをトレースした後、TSQLDataSetが開いてデータセットをトラバースしたことがわかりました。問題の原因は、TDBXNoOpRowを使用する次の2つのメソッドに関連している必要があります

function TDSVoidConnectionHandler.CreateDbxRow: TDBXStreamerRow;
begin
  Result := TDBXNoOpRow.Create(DBXContext);
end;

function TDSServerCommand.CreateParameterRow: TDBXRow;
begin
  Result := TDBXNoOpRow.Create(FDbxContext);
end;

TDBXNoOpRowインスタンスはによって消費されます

procedure TDBXStreamValue.SetRowValue;
begin
  if FExtendedType then
  begin
    if FStreamStreamReader <> nil then
      FDbxRow.SetStream(Self, FStreamStreamReader)
    else if FByteStreamReader <> nil then
      FDbxRow.SetStream(Self, FByteStreamReader)
    else
      inherited SetRowValue;
  end else
    inherited SetRowValue;
end;

TDBXNoOpRowは何もしないので、データパケットは上記の方法で転送されません。これがインプロセスメカニズムを使用した問題の原因であると思われます。

TLocalConnectionを破棄して、インプロセスDataSnapアプリケーションのTDSProviderConnectionに置き換えることができるかどうかわかりませんか?私はDBXソースコードを何日も追跡してきましたが、この問題の手がかりさえ見つけることができません。

4

1 に答える 1

6
于 2009-10-19T14:45:30.390 に答える