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

Windows CE (WinCE) 整合 SQLite 3 完整步驟:VS2008 MFC 智慧裝置專案

     編輯:程式設計疑難解答

在 Windows CE / Windows Mobile 環境下使用 SQLite,需針對 ARM/MIPS/x86 交叉編譯 SQLite 原始碼,並正確設定 VS2008 專案的包含目錄、庫目錄與連結器選項。本文提供從原始碼編譯到專案整合的完整流程。

環境準備

  • Visual Studio 2008 + Windows Mobile 6 SDK / Windows CE 6.0 SDK
  • SQLite 合併原始碼:sqlite3.c、sqlite3.h、sqlite3ext.h(官網下載 sqlite-amalgamation-xxxxxxx.zip)
  • 目標平台:ARMv4i (Windows Mobile 6) / ARMv7 (Windows Embedded Compact 7/2013)

步驟 1:建立 SQLite 靜態庫專案

  1. VS2008 → 新增專案 → Visual C++ → MFC → **MFC 智慧裝置 DLL/靜態庫**
  2. 專案名:`SQLiteCE`,目標平台選對應 SDK(如 Windows Mobile 6 Professional SDK (ARMV4I))
  3. 專案屬性 → C/C++ → 前置處理器定義,新增:
    SQLITE_OS_WIN=1; SQLITE_OMIT_LOAD_EXTENSION=1; HAVE_USLEEP=1; _CRT_SECURE_NO_WARNINGS
  4. 將 `sqlite3.c`、`sqlite3.h` 加入專案
  5. 編譯 → 輸出 `SQLiteCE.lib`

步驟 2:主專案引用 SQLite

  1. 主專案屬性 → C/C++ → 一般 → **附加包含目錄**:加入 `SQLiteCE` 專案目錄(含 `sqlite3.h`)
  2. 連結器 → 一般 → **附加庫目錄**:加入 `SQLiteCE` 輸出目錄(含 `.lib`)
  3. 連結器 → 輸入 → **附加相依性**:新增 `SQLiteCE.lib; coredll.lib; aygshell.lib`
  4. 主專案 `stdafx.h` 或通用頭檔加入:
    #include "sqlite3.h"
    #pragma comment(lib, "SQLiteCE.lib")

步驟 3:程式碼範例(開啟/建表/插入/查詢)

#include "sqlite3.h"
#include   // CString

void TestSQLite()
{
    sqlite3 *db = nullptr;
    int rc = sqlite3_open(_T("\\My Documents\\test.db"), &db);  // CE 路徑用反斜線
    if (rc != SQLITE_OK) {
        CString err; err.Format(_T("Open failed: %s"), sqlite3_errmsg(db));
        AfxMessageBox(err); return;
    }

    // 建表
    const char *sql = "CREATE TABLE IF NOT EXISTS users("
                      "id INTEGER PRIMARY KEY AUTOINCREMENT,"
                      "name TEXT NOT NULL,"
                      "age INTEGER);";
    char *errMsg = nullptr;
    rc = sqlite3_exec(db, sql, nullptr, nullptr, &errMsg);
    if (rc != SQLITE_OK) {
        AfxMessageBox(CString(errMsg)); sqlite3_free(errMsg);
    }

    // 參數化插入
    sqlite3_stmt *stmt;
    sqlite3_prepare_v2(db, "INSERT INTO users(name,age) VALUES(?,?);", -1, &stmt, nullptr);
    sqlite3_bind_text(stmt, 1, "Alice", -1, SQLITE_STATIC);
    sqlite3_bind_int(stmt, 2, 25);
    sqlite3_step(stmt);
    sqlite3_finalize(stmt);

    // 查詢
    sqlite3_prepare_v2(db, "SELECT id,name,age FROM users;", -1, &stmt, nullptr);
    while (sqlite3_step(stmt) == SQLITE_ROW) {
        int id = sqlite3_column_int(stmt, 0);
        const char *name = (const char*)sqlite3_column_text(stmt, 1);
        int age = sqlite3_column_int(stmt, 2);
        CString s; s.Format(_T("ID:%d Name:%s Age:%d"), id, name, age);
        AfxMessageBox(s);
    }
    sqlite3_finalize(stmt);
    sqlite3_close(db);
}

關鍵避坑指南

問題原因解決
連結錯誤 LNK2019: sqlite3_open未連結 SQLite 靜態庫檢查「附加相依性」含 `SQLiteCE.lib`
執行時「找不到 sqlite3.dll」WinCE 無預設 SQLite,必須靜態連結專案屬性 → C/C++ → 程式碼產生 → 執行階段程式庫:`/MT` (靜態) 或確保裝置有 DLL
路徑錯誤 unable to open database fileWinCE 路徑格式不同用絕對路徑 `
中文亂碼SQLite 預設 UTF-8,CE 系統預設 MBCS字串存入前 `WideCharToMultiByte(CP_UTF8,...)`,讀出後 `MultiByteToWideChar(CP_UTF8,...)`
多執行緒存取死結預設序列化模式`sqlite3_config(SQLITE_CONFIG_SERIALIZED)` 或開啟 WAL 模式 `PRAGMA journal_mode=WAL;`

進階:啟用 WAL 模式提升並發

sqlite3_exec(db, "PRAGMA journal_mode=WAL;", nullptr, nullptr, nullptr);
sqlite3_exec(db, "PRAGMA synchronous=NORMAL;", nullptr, nullptr, nullptr);

參考資源

  • SQLite 官方編譯說明:https://www.sqlite.org/compile.html
  • Windows CE 開發文件:https://learn.microsoft.com/en-us/previous-versions/windows/embedded/
  • 完整範例專案(含 ARM/MIPS/x86 批次建構腳本):見文中引用連結 https://www.docin.com/p-632122826.html

遵循「交叉編譯靜態庫 → 專案正確引用 → 路徑/編碼/並發正確處理」三步驟,即可在 VS2008 MFC 智慧裝置專案中穩定使用 SQLite 3。

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