我可以通过进程内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源代码,甚至无法找到解决这个问题的线索。
答案 0 :(得分:6)