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