DatasnapFireDAC:查询执行两次



我有以下问题:

1)我使用Delphi XE7开发了一个三层的系统。

2)服务器层,使用REST创建datasnap

3)我使用Firebird作为数据库,并使用FireDAC进行访问。

4)我有一个值01的序列。 5)我在服务器层创建了如下查询:
Select GEN_ID (gen_my_sequence, 1) from rdb $ database

6)服务器上返回的序列值在查询中为:02.

7)但是客户端返回03.

我不明白为什么要执行两次查询。

有人能帮我吗?

这是firebird中生成器(序列)的性质。它们的值在每次请求时都会增加,并且生成器的值从该请求更新并保持更新。此外,生成器位于事务控制之外。请参阅firebirdsql生成器基础指南。

我使用Embarcadero指示的技术标准。

我意识到的是:

1)单位Data。FireDACJSONReflectTFDJSONInterceptor。ItemListToJSONObject例程有这样一段代码:

if not LActive then
   LDataSet.Active := True;
try
   LJSONDataSet := DataSetToJSONValue(LDataSet);
   // Use AddPair overload that will accept blank key
   AJSONObject.AddPair(TJSONPair.Create(LPair.Key, LJSONDataSet))
finally
   if not LActive then
      LDataSet.Active := False;
 end;

看他激活查询一次,导致序列递增。

但是在DataSetToJSONValue (LDataSet)例程中;这个代码块是:

if  (LMemTable = nil) then
    begin
    LMemTable := TFDMemTable.Create(nil);
    LAdapter := TFDTableAdapter.Create(nil);
    LMemTable.Adapter := LAdapter;
    LAdapter.SelectCommand := ADataSet.Command;
    LMemTable.Active := True;
    end;

看他再次激活查询,其中序列再次增加。

现在我不知道如果我犯了一个错误,或者如果它是一个错误,但我创建了一个新类继承自 TFDMemTable ,觉得有一些错误在这个类中,但做了一个测试 TFDMemTable 组件,FireDAC的标准组件,甚至然后激活任何查询执行了两次,因为这两个类的代码不考虑任何,作为 TFDCustomMemTable ,尽管他们直接从这个类继承。

我注释了DataSetToString例程(const dataset: TFDAdaptedDataSet)的代码,看起来像这样:

LMemTable   := nil;
LAdapter    := nil;
try
    //if  (ADataSet is TFDCustomMemTable) then
  LMemTable := TFDCustomMemTable(ADataSet);
  {if  (LMemTable = nil) then
      begin
      LMemTable := TFDMemTable.Create(nil);
      LAdapter := TFDTableAdapter.Create(nil);
      LMemTable.Adapter := LAdapter;
      LAdapter.SelectCommand := ADataSet.Command;
      LMemTable.Active := True;
      end;}

这样问题就解决了,应用程序的性能似乎也得到了提高。

相关内容

  • 没有找到相关文章

最新更新