0

我正在使用 sqldb 组件在 Lazarus 中开发一个应用程序(用于 Win32 和 WinCE)进行数据访问。

远程数据库是 PostgreSQL(但我对本地 SQLite 有相同的行为)。与 PostgreSQL 的连接工作完美,但是当我打开任何查询(也是一个非常简单的选择)数据库时,进入事务:“事务中的空闲”。

var
  PGConnection:TPQConnection;
  PGTransaction:TSQLTransaction;
  myQuery:TSQLQuery;
begin
  PGConnection := TPQConnection.Create(self);
  PGTransaction := TSQLTransaction.Create(self);
  myQuery := TSQLQuery.Create(self);
  try
    PGConnection.HostName := '192.168.1.2';
    PGConnection.DatabaseName:='testdb';
    PGConnection.UserName:='test';
    PGConnection.Password:='test';
    PGConnection.Transaction := PGTransaction;
    PGConnection.Open;

    myQuery.DataBase := PGConnection;
    myQuery.SQL.Add('SELECT 1 AS value');
    myQuery.Open; // <- this start transaction
    ShowMessage(myQuery.FieldByName('value').AsString); // <- db: "idle in transaction"
    myQuery.Close; // <- db: "idle in transaction"
    PGConnction.Close; 
  finally
    myQuery.Free;
    PGConnection.Free;
    PGTransaction.Free;
  end;
end;  

好吧,也许 sqldb 是这样工作的:对数据库的每个查询都会启动一个事务,因此,开发人员必须在询问后 Commit 或 Rollback。但还有另一个问题:当我提交事务时,sqldb 关闭查询,我无法访问检索到的值:

var
  PGConnection:TPQConnection;
  PGTransaction:TSQLTransaction;
  myQuery:TSQLQuery;
begin
  PGConnection := TPQConnection.Create(self);
  PGTransaction := TSQLTransaction.Create(self);
  myQuery := TSQLQuery.Create(self);
  try
    PGConnection.HostName := '192.168.1.2';
    PGConnection.DatabaseName:='testdb';
    PGConnection.UserName:='test';
    PGConnection.Password:='test';
    PGConnection.Transaction := PGTransaction;
    PGConnection.Open;

    myQuery.DataBase := PGConnection;
    myQuery.SQL.Add('SELECT 1 AS value');
    myQuery.Open; // <- this start transaction
    PGConnection.Transaction.Active := False; // <- Close also myQuery
    ShowMessage(myQuery.FieldByName('value').AsString); // <- Error: Field "value" not found
    myQuery.Close; 
    PGConnction.Close; 
  finally
    myQuery.Free;
    PGConnection.Free;
    PGTransaction.Free;
  end;
end;  

这种行为有点无聊:我不能将 TSQLQuery 数据集与 dbgrid 一起使用(因为我不希望我的数据库在事务中太久)所以我需要在内存表中移动选定的数据。

这是一个错误,我犯了一些错误还是正常操作?有没有一种方法可以打开 SELECT 查询并在不启动事务的情况下使用它?

4

1 回答 1

3

这是目前的正常行为。我计划了一个“离线”模式,其中交易关闭但数据保持打开状态。您当前可以做的是将数据保存到文件(使用 savetofile 方法),断开连接,然后再次从文件加载数据(使用 loadfromfile 方法)

于 2013-09-15T12:49:23.670 回答