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

Qt 5.4.1 x64 系統下操作 32 位 SQLite:能開庫卻無法讀寫?權限與路徑才是關鍵

     編輯:程式設計綜合問答

現象

Qt 5.4.1 (MinGW 32-bit) 在 Windows x64 上打開 32 位 `test.db` 成功(`db.open()` 返回 `true`),但 `INSERT`、`SELECT` 全返回 `false`,無報錯資訊。

誤區澄清:x64 系統完美支援 32 位應用

WoW64 子系統保證 32 位進程對 32 位 DLL(含 `sqlite3.dll`)的載入與執行零差異,**不是架構不匹配導致**。

真兇 Top 2

1. 資料庫檔案寫入權限

  • 程式安裝在 `C:\Program Files (x86)\` 等受保護目錄,UAC 阻擋寫入。
  • 解決:將 `.db` 放在 `%APPDATA%\YourApp\`、`%LOCALAPPDATA%\` 或使用者文檔目錄,確保當前使用者有修改權限。

2. 相對路徑解析錯誤

db.setDatabaseName("test.db");  // 相對路徑 → 工作目錄不一定是 exe 所在目錄
  • Qt Creator 執行時工作目錄為專案建構目錄;雙擊 exe 時為 exe 所在目錄;系統服務時為 `C:\Windows\System32\`。
  • 最佳實踐:
    `QString path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + "/test.db";`
    `db.setDatabaseName(path);`

診斷步驟

  1. 檢查 `db.lastError().text()` 輸出具體錯誤碼(如 `unable to open database file`、`disk I/O error`)。
  2. 用 DB Browser for SQLite 手動打開同一路徑檔案,嘗試執行同樣 SQL,排除檔案損壞。
  3. 啟用 SQLite 追蹤:`db.setConnectOptions("QSQLITE_ENABLE_REGEXP=1;QSQLITE_BUSY_TIMEOUT=5000");` 觀察 `QSqlQuery::lastError()`。

程式碼修正版

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
QString dbPath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
QDir().mkpath(dbPath);
db.setDatabaseName(dbPath + "/test.db");

if (!db.open()) {
    qCritical() << "Open failed:" << db.lastError().text();
    return -1;
}

QSqlQuery query(db);
if (!query.exec("CREATE TABLE IF NOT EXISTS user (name TEXT, action TEXT)")) {
    qCritical() << "Create table failed:" << query.lastError().text();
}

bool ok = query.exec("INSERT INTO user VALUES('xiaomei','actaction')");
qDebug() << "Insert:" << ok << query.lastError().text();

query.exec("SELECT name FROM user");
while (query.next()) {
    qDebug() << "User:" << query.value(0).toString();
}

總結

「能開不能寫」99% 是**權限**或**路徑**問題。善用 `QStandardPaths` 取得可寫目錄,並在 `open()` 後必檢 `lastError()`,即可快速定位。

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