環境:Cygwin + SQLite3。編譯需連結 sqlite3.lib。
#include
#include "sqlite3.h"
#include
using namespace std;
const char* sqlCreate = "CREATE TABLE items(id INTEGER PRIMARY KEY, stocknum FLOAT, name VARCHAR(30), price FLOAT, status VARCHAR(12))";
const char* sqlSelect = "SELECT stocknum, name, price FROM items ORDER BY stocknum";
const char* sqlInsert0 = "INSERT INTO items VALUES(NULL, 323.123, 'Product01', 565.456, 'IN')";
const char* sqlInsert1 = "INSERT INTO items VALUES(NULL, 423.123, '莉?', 665.456, 'IN')";
const char* sqlInsert2 = "INSERT INTO items VALUES(NULL, 523.123, 'Product02', 765.456, 'IN')";
int printedHeader = 0;
static int callback(void* NotUsed, int columns, char** azData, char** azColName) {
int i;
if (printedHeader == 0) {
printedHeader = 1;
for (i = 0; i < columns; i++) {
printf("%s ", azColName[i]);
}
printf("\n");
}
for (i = 0; i < columns; i++) {
printf("%s ", azData[i] ? azData[i] : "NULL");
}
printf("\n");
return 0;
}
int main(int argc, char** argv) {
cout << "Begin, please waiting..." << endl;
cout << "Parameters:" << endl;
for (int k = 1; k < argc; k++) {
cout << " " << k << " -> " << argv[k] << endl;
}
cout << endl;
sqlite3* db;
char* zErrMsg = 0;
int rc;
if (argc != 3) {
printf("Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
return 1;
}
rc = sqlite3_open(argv[1], &db);
if (rc) {
printf("Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
rc = sqlite3_exec(db, sqlCreate, NULL, 0, &zErrMsg);
if (rc != SQLITE_OK) {
printf("Create SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
rc = sqlite3_exec(db, sqlInsert0, NULL, 0, &zErrMsg);
if (rc != SQLITE_OK) { printf("INSERT 0 error: %s\n", zErrMsg); sqlite3_free(zErrMsg); }
rc = sqlite3_exec(db, sqlInsert1, NULL, 0, &zErrMsg);
if (rc != SQLITE_OK) { printf("INSERT 1 error: %s\n", zErrMsg); sqlite3_free(zErrMsg); }
rc = sqlite3_exec(db, sqlInsert2, NULL, 0, &zErrMsg);
if (rc != SQLITE_OK) { printf("INSERT 2 error: %s\n", zErrMsg); sqlite3_free(zErrMsg); }
rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
if (rc != SQLITE_OK) {
printf("SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
sqlite3_close(db);
printf("Finished, exit now.\n");
return 0;
}
sqlite3_open:開啟/建立資料庫檔案sqlite3_exec:執行 SQL,非查詢傳 NULL callback,查詢傳 callback 函數指標callback:逐列回呼,azColName 為欄位名陣列,azData 為資料值陣列sqlite3_errmsg / sqlite3_free:錯誤訊息處理sqlite3_close:關閉連線釋放資源gcc -o sqlite_demo sqlite_demo.c -lsqlite3
./sqlite_demo test.db "SELECT * FROM items"
此範例涵蓋建表、插入、參數化查詢回呼,可作為嵌入式 SQLite 開發的起手模板。