QSqlQuery::lastError() 返回 QSqlError 物件,包含錯誤類型、數據庫原文、驅動文本等詳細資訊。
QSqlQuery query;
bool ok = query.exec("INSERT INTO user(name) VALUES('test')");
if (!ok) {
QSqlError err = query.lastError();
qDebug() << "SQL Error:" << err.driverText() // 驅動層錯誤(如 "Duplicate entry")
<< "| DB Text:" << err.databaseText() // 數據庫原文
<< "| Type:" << err.type(); // 錯誤分類
// 可根據 err.number() 進行具體處理(如 1062 為主鍵衝突)
}
| type() | 含義 | 典型場景 |
|---|---|---|
| QSqlError::NoError | 成功 | — |
| QSqlError::ConnectionError | 連線失敗 | IP/Port/防火牆/服務未啟動 |
| QSqlError::StatementError | SQL 語法/語義錯誤 | 表不存在、欄位拼寫錯誤、類型不匹配 |
| QSqlError::TransactionError | 事務失敗 | 死鎖、回滾失敗 |
| QSqlError::UnknownError | 其他 | 驅動 Bug、資源耗盡 |
QSqlDatabase::setConnectOptions("MYSQL_OPT_RECONNECT=1") 自動重連。QSqlQuery::prepare() + bindValue() 防注入並獲得更清晰的錯誤定位。execWithLog() 函式,統一記錄 SQL 文本、耗時、錯誤碼,便於審計與排查。