我有以下问题:
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。FireDACJSONReflect在TFDJSONInterceptor。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;}
这样问题就解决了,应用程序的性能似乎也得到了提高。