首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi FireDAC SQLite 建立資料庫與資料表(四):記憶體/檔案模式、UTF-8/16、頁大小、鎖定模式、TFDCommand/TSQLiteStatement 多種建表方式

     編輯:Delphi

前言

FireDAC 連接 SQLite 時,透過連接參數精確控制資料庫建立行為:記憶體庫、檔案庫、編碼、頁大小、快取、鎖定策略。建表則可用 TFDConnection.ExecSQL、TFDCommand、底層 TSQLiteStatement 三種方式。本文完整示範從連接參數到建表的標準流程。

一、連接參數全解析

1. 記憶體資料庫(最高速,進程結束消失)

FDConnection1.DriverName := 'SQLite'; // 等同 Params.Add('DriverID=SQLite')
FDConnection1.Params.Add('Database=:memory:'); // 可省略,FireDAC 內定空字串即為 :memory:
FDConnection1.Params.Add('SQLiteAdvanced=page_size=4096'); // 頁大小 4KB
FDConnection1.Connected := True;

2. 檔案資料庫(持久化)

FDConnection1.Params.Add('DriverID=SQLite');
FDConnection1.Params.Add('Database=C:\Data\MyApp.sdb'); // 存在即開啟,不存在即建立
// 進階參數
FDConnection1.Params.Add('SQLiteAdvanced=temp_store=MEMORY');        // 臨時表存記憶體 (0=DEFAULT, 1=FILE, 2=MEMORY)
FDConnection1.Params.Add('SQLiteAdvanced=temp_store_directory=C:\Temp'); // 臨時檔目錄
FDConnection1.Params.Add('OpenMode=CreateUTF8');                     // UTF-8 編碼 (預設),可選 CreateUTF16
FDConnection1.Params.Add('LockingMode=Normal');                      // Normal 共享, Exclusive 獨占(寫入更快)
FDConnection1.Connected := True;

所有進階參數對應 SQLite PRAGMA,詳見 SQLite PRAGMA 文檔。

二、表單元件最小配置

object FDConnection1: TFDConnection; Left = 34; Top = 24; end
object FDPhysSQLiteDriverLink1: TFDPhysSQLiteDriverLink; Left = 143; Top = 24; end
object FDGUIxWaitCursor1: TFDGUIxWaitCursor; Provider = 'Forms'; Left = 260; Top = 24; end
object FDQuery1: TFDQuery; Connection = FDConnection1; Left = 32; Top = 80; end
object DataSource1: TDataSource; DataSet = FDQuery1; Left = 148; Top = 80; end
object FDCommand1: TFDCommand; Connection = FDConnection1; Left = 264; Top = 88; end
object DBGrid1: TDBGrid; Left = 24; Top = 144; Width = 409; Height = 137; DataSource = DataSource1; end

三、三種建表方式對比

方式 1:TFDConnection.ExecSQL(最簡潔,推薦日常使用)

procedure TForm1.FormCreate(Sender: TObject);
const DB_PATH = 'C:\Data\Demo.sdb';
begin
  if FileExists(DB_PATH) then DeleteFile(DB_PATH);
  FDConnection1.Params.Add('DriverID=SQLite');
  FDConnection1.Params.Add('Database=' + DB_PATH);
  FDConnection1.Connected := True;

  FDConnection1.ExecSQL('CREATE TABLE MyTable(' +
    'ID INTEGER PRIMARY KEY,' +
    'Name STRING(10),' +
    'Age BYTE,' +
    'Note TEXT,' +
    'Picture BLOB)');

  FDQuery1.Open('SELECT * FROM MyTable');
end;

方式 2:TFDCommand(設計時可視化編輯 CommandText,適合複雜 DDL 腳本)

procedure TForm1.FormCreate(Sender: TObject);
begin
  // ... 連接初始化同前 ...
  with FDCommand1.CommandText do begin
    Add('CREATE TABLE MyTable(');
    Add('ID INTEGER PRIMARY KEY,');
    Add('Name STRING(10),');
    Add('Age BYTE,');
    Add('Note TEXT,');
    Add('Picture BLOB');
    Add(')');
  end;
  FDCommand1.Active := True; // 執行
  FDQuery1.Open('SELECT * FROM MyTable');
end;

方式 3:TSQLiteStatement(直達 SQLite C API,效能最高,適合批量 Schema 遷移)

uses FireDAC.Phys.SQLiteWrapper;

procedure ExecSQLDirect(ACon: TFDConnection; const ASQL: string);
var Stmt: TSQLiteStatement;
begin
  Stmt := TSQLiteStatement.Create(ACon.CliObj);
  try
    Stmt.Prepare(ASQL);
    Stmt.Execute;
    while Stmt.PrepareNextCommand do Stmt.Execute; // 支援多條 SQL 以分號分隔
  finally Stmt.Free; end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // ... 連接初始化 ...
  ExecSQLDirect(FDConnection1,
    'CREATE TABLE MyTable(ID INTEGER PRIMARY KEY, Name STRING(10), Age BYTE, Note TEXT, Picture BLOB)');
  FDQuery1.Open('SELECT * FROM MyTable');
end;

四、FireDAC 型別映射表(Delphi → SQLite 存儲類別)

Delphi 型別SQLite 存儲類別說明
ftInteger, ftLargeint, ftAutoIncINTEGER64 位有號整數
ftFloat, ftCurrency, ftBCD, ftFMTBcdREALIEEE 754 雙精度
ftString, ftWideString, ftFixedChar, ftMemo, ftWideMemoTEXTUTF-8/16 字串
ftBlob, ftGraphic, ftTypedBinary, ftOraBlobBLOB原始位元組
ftDate, ftTime, ftDateTime, ftTimeStampTEXT / REALFireDAC 預設存 ISO8601 字串,可設 DateTimeFormat=Julian 存 REAL
ftBooleanINTEGER0/1
ftGUIDTEXT36 字元字串

FireDAC 幕後自動轉換,開發者可直接使用 Delphi 原生型別定義 FieldDefs。

五、效果圖

建表後 DBGrid 顯示空表結構

結語

FireDAC 建立 SQLite 資料庫的核心在於連接參數的精確配置(Database, JournalMode, LockingMode, PageSize...)與建表方式的選擇。TFDConnection.ExecSQL 簡潔易用,TFDCommand 適合設計時管理,TSQLiteStatement 適合高效能批量遷移。型別映射表讓 Delphi 開發者無需記憶 SQLite 型別系統,專注業務建模。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved