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
);

列含义

类型含义
idINTEGER PK自增标识。UPDATE / DELETE 的 WHERE
order_noTEXT订单号(O1001O1002、…)。由 Data::OrderSeq 自动递增
menu_nameTEXT菜单名。示例在 7 项中循环 — Americano · Latte · Cappuccino · Espresso · Mocha · Green Tea · Lemonade
start_timeTEXT下单开始时间。SYS.DateTimeString
end_timeTEXT下单结束时间。按下 Update 时取当时的 SYS.DateTimeString
weight_gREAL萃取重量(g)。Update 时使用演示用固定值 250
resultTEXT"Pending""Done" / "NG"
is_errorINTEGER0/1(false/true)。单独设置该列以区分结果与错误标志

SQLite 是动态类型系统,只需指定 INTEGER / TEXT / REAL 即可。迁移到 MSSQL 时,请用 NVARCHARDATETIME2DECIMAL(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_nomenu_nameweight_gresultis_error
O1001Americano250Done0
O1002Latte300Done0
O1003Cappuccino280Done0
O1004Espresso30NG1
O1005Mocha320Done0

因此 只要建好表,一次 Open 就同时准备好了演示数据。

表结构变更后注意

  • 增删列时,需同步更新 DB_Refresh 的 SELECT 列表(第 7 章)与 DataGrid 的 Columns 定义。
  • 由于 WHERE id = ? 模式散布于代码各处,主键名保持为 id 最为稳妥。

下一章

结构准备就绪后,先用 DB Studio 的 SQL · Data 选项卡 直接确认 / 操作数据。