我正在使用 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 查询并在不启动事务的情况下使用它?