SQLite データベースに関する質問(FireDAC)

提供: RAD Studio
移動先: 案内検索

FAQ(FireDAC) への移動


このトピックでは、SQLite データベースに関係する質問と回答の一覧を扱います。

Q1: SQLite データベースで照合順序を定義するには、どうすればよいでしょうか。

A: "FireDAC\Samples\DBMS Specific\SQLite\UserCollation" を調べて、完成した照合順序、関数、拡張機能の API、デモを参照してください。

設計時に照合順序/関数が必要な場合は、設計時パッケージ(見せかけのコンポーネント)を作成し、そこでユーザー定義の照合順序/関数を登録します。

Q2: SQLite 例外 "[FireDAC][DApt]-401。レコードが別のユーザーにロックされています" が発生します。

A: この例外が発生するのは、UPDATE コマンドの実行の際に、同じテーブルに別の DB 接続のカーソルがあり、そこからすべてのレコードが取得されるわけではない場合です。 FetchOptions.Mode=fmAll を使用する必要があります。 このオプションを ADConnection レベルで設定して、そこにリンクされるすべてのデータセットでこのオプションが継承されるようにすることができます。

Q3: テーブル以外の SELECT リスト項目のデータ型が間違っているのでしょうか。 集計関数が文字列値を返します。 どこが間違っているのでしょうか。

A: SQLite では、テーブル以外の SELECT リスト項目のデータ型を返しません。 項目が式の場合、FireDAC ではそのデータ型を取得できません。 そのため、そのような項目はただ ftWideString として記述されるのです。 FireDAC では、SELECT 項目データ型を次のように指定できます: <項目> as "<エイリアス>::<データ型>"例:

 
SELECT count(*) as "cnt::int" from ...

Q4: 文字マクロが SQLite でサポートされていないように見えます。 試したのは、CONCAT、LEFT、SUBSTR、UCASE です。

A: これらの関数は、FireDAC の式評価モジュールを使って実装されています。 実行時に接続を作成する場合は、uADStanExprFuncs.pas を uses 句に追加しなければなりません。

SQLite では、限られた組み込み関数群がありますが、カスタム関数を作成して登録することもできます。 FireDAC には、式評価モジュール用に実装されたカスタム関数が多数あります。 これらは FireDAC.Stan.ExprFuncs ユニットに実装され登録されています。 SQLite ドライバでは、既知の式評価関数をすべて sqlite3.dll に自動的に登録します。

Q5: sqlite3_progress_handler は FireDAC で実装されていますか。

A: はい。 次のようなコードを使用します。

procedure Tform1.FormCreate(Sender: TObject);
begin
FDConnection1.Open;
with TSQLiteDatabase(FDConnection1.ConnectionIntf.CliObj) do begin
ProgressNOpers := 50000;
OnProgress := SQLiteOnProgress;
end;
end;
procedure Tform1.SQLiteOnProgress(ADB: TSQLiteDatabase; var ACancel: Boolean);
begin
Application.ProcessMessages;
end;

Q6: マルチスレッド アプリケーションを扱うと、WAL ファイルが非常に大きくなります(1 GB を超えます)。 WAL ファイルが大きくならないようにする方法について、何か提案はありますか。

A: WAL ファイルが増大し続ける場合、ログからデータをデータベース ファイルに移動できないということです。 おそらく、データベースが絶えず読み取りスレッドで使用されているか、トランザクションがコミットされずに DML 操作が実行されているのではないでしょうか。 その場合の解決策は、短時間トランザクションだけを使用するか、DML 操作用に別個のスレッドを作成することです(この場合は、さらにトランザクションを絶えずコミットしなければなりません)。

チェックポイントが実行され、WAL データがすべてデータベース ファイルにコピーされたら、次の書き込み処理が、WAL ファイルの先頭への書き込みを再び開始します。 WAL ファイルは通常、ここでは切り詰められません(切り詰める場合は PRAGMA journal_size_limit を参照してください)。 なぜなら、ファイルを切り詰めた後でその末尾に追加を開始するより、既存のファイルを上書きした方が速いからです。

そのため、すべてがうまくいけば、SQLite は、チェックポイントが完了するたびに WAL ファイルの先頭から書き込みをやり直すはずです。こうして、WAL ファイルが際限なく大きくなるのを回避できます。 うまくいかないおそれがある状況としては、以下の 2 とおりあります。

  • チェックポイントで WAL ファイルからデータベース ファイルにデータがすべてコピーされるのを読み取り処理が妨げる場合
  • チェックポイントの実行中に、何か他のプロセスがデータベースに書き込む(WAL ファイルの末尾に追加する)場合

上記のどちらかが起こると、次の書き込み処理は、WAL ファイルの先頭から書き込むのではなく末尾に追加します。 チェックポイントのたびにこのようなことが起こると、WAL ファイルは際限なく大きくなります。