Database 手册 · Chapter 3
表结构 — order_history
示例使用 单一表 order_history 完成全部演示。领域是 "烹调 / 订单作业历史" — 用一行记录一杯饮品的下单开始时间、结束时间、重量(g)和结果("Done" · "NG" · "Pending")。
CREATE TABLE
示例项目首次运行时,SQLite 文件 XDatabase/LocalDB.db 会自动生成,但 order_history 表必须事先存在。在 DB Studio 或外部 SQLite 工具(DBeaver、sqlite3 CLI 等)中执行一次以下 DDL 即可。
CREATE TABLE IF NOT EXISTS order_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
order_no TEXT NOT NULL,
menu_name TEXT NOT NULL,
start_time TEXT,
end_time TEXT,
weight_g REAL DEFAULT 0,
result TEXT DEFAULT 'Pending',
is_error INTEGER DEFAULT 0
);列含义
| 列 | 类型 | 含义 |
|---|---|---|
id | INTEGER PK | 自增标识。UPDATE / DELETE 的 WHERE 键 |
order_no | TEXT | 订单号(O1001、O1002、…)。由 Data::OrderSeq 自动递增 |
menu_name | TEXT | 菜单名。示例在 7 项中循环 — Americano · Latte · Cappuccino · Espresso · Mocha · Green Tea · Lemonade |
start_time | TEXT | 下单开始时间。SYS.DateTimeString |
end_time | TEXT | 下单结束时间。按下 Update 时取当时的 SYS.DateTimeString |
weight_g | REAL | 萃取重量(g)。Update 时使用演示用固定值 250 |
result | TEXT | "Pending" → "Done" / "NG" |
is_error | INTEGER | 0/1(false/true)。单独设置该列以区分结果与错误标志 |
SQLite 是动态类型系统,只需指定
INTEGER/TEXT/REAL即可。迁移到 MSSQL 时,请用NVARCHAR、DATETIME2、DECIMAL(10,3)等更严格的类型重新声明。
表为空时自动填充 5 条
Data::DB_Open() 在连接后立即检查行数,若为 0 则调用 DB_InsertInitialSamples(),以事务批量 INSERT 5 条学习数据。
// Data.xms 摘录
int rowCnt = DB["local"].RunSqlScalarInt("SELECT COUNT(*) FROM order_history");
if( rowCnt == 0 )
{
Log($"order_history is empty, insert initial 5 samples");
DB_InsertInitialSamples();
}DB_InsertInitialSamples 的池(pool)数据如下。
| order_no | menu_name | weight_g | result | is_error |
|---|---|---|---|---|
| O1001 | Americano | 250 | Done | 0 |
| O1002 | Latte | 300 | Done | 0 |
| O1003 | Cappuccino | 280 | Done | 0 |
| O1004 | Espresso | 30 | NG | 1 |
| O1005 | Mocha | 320 | Done | 0 |
因此 只要建好表,一次 Open 就同时准备好了演示数据。
表结构变更后注意
- 增删列时,需同步更新
DB_Refresh的 SELECT 列表(第 7 章)与 DataGrid 的 Columns 定义。 - 由于
WHERE id = ?模式散布于代码各处,主键名保持为id最为稳妥。
下一章
结构准备就绪后,先用 DB Studio 的 SQL · Data 选项卡 直接确认 / 操作数据。