データ アクセスに 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 はこのように機能します。データベースに対するすべてのクエリがトランザクションを開始するため、開発者は問い合わせ後にコミットまたはロールバックする必要があります。しかし、別の質問があります: トランザクションをコミットすると、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 クエリを開いて、トランザクションを開始せずに使用する方法はありますか?