我们可以使用TDSProviderConnection来替换进程内DataSnap应用程序的TLocalConnection吗?

时间:2009-10-14 14:20:23

标签: delphi datasnap

我可以通过进程内DataSnap应用程序访问服务器方法。点击here了解详情。

但是,进程中数据绑定应用程序还有另一个方面。它是IAppServer或TDataSetProvider。

在Delphi 2009之前,我使用TConnectionBroker和TLocalConnection进行进程内数据访问。新的Delphi 2009/2010 DataSnap允许我们使用TDSProviderConnection作为 REMOTESERVER。但是,我只能使它适用于TCP / HTTP连接。我不能将TDSProviderConnection用于进程内datasnap应用程序。它会提示“指针操作无效”。

这就是我的代码的样子:

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是一个TDSServerModule类后代,由连接在一起的TDataSetProvider,TSQLDataSet和TSQLConnection组成。

在跟踪源代码后,我发现TSQLDataSet确实打开并遍历数据集。问题的原因应该与使用TDBXNoOpRow

的以下两种方法有关
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并将TDSProviderConnection替换为进程内DataSnap应用程序?我已经追踪了几天的DBX源代码,甚至无法找到解决这个问题的线索。

1 个答案:

答案 0 :(得分:6)