在VS2010下c++與Sqlite3的連線
SQLite並沒有一次性做到位,只有下載這些東西是不能放在vs2010中並馬上使用的,下載下來的檔案中有sqlite3.c/h/dll/def,還是不夠用的。我們需要的sqlite3.lib檔案並不在其中,需要我們自己動手了。
這兒要用到visual studio提供的Visual Studio Command Prompt工具了。開啟之後,進入含有sqlite3.dll和sqlite3.def的目錄下,輸入以下命令:
LIB /DEF:sqlite3.def /MACHINE:IX86
就能生成sqlite3.exp和sqlite3.lib檔案了,這樣在工程中就可以加入lib檔案進行編譯了。
第一步:
在vs2010下建立一個空的win32工程SQLite3Test,在工程的屬性-連結-輸入中新增sqlite3.lib的引用。新增新的檔案main.cpp,寫一個main函式,並編譯一下。
好,接下來把sqlite3.h/def/exp/lib通通放進SQLite3Test\SQLite3Test\目錄下,跟main.cpp在一起,如圖:
把sqlite3.dll跟生成的exe放在一起。
第二步:
寫下原始碼:
#include <iostream> #include "sqlite3.h" static std::string strName[] = {"土行孫","哪吒","楊戩","金吒","木吒","雷震子"}; int sqlite3_exec_callback(void *data, int nColumn, char **colValues, char **colNames); int sqlite3_exec_callback(void *data, int nColumn, char **colValues, char **colNames) { for (int i = 0; i < nColumn; i++) { printf("%s\t", colValues[i]); } printf("\n"); return 0; } int main() { sqlite3 *conn = NULL; char *err_msg = NULL; char sql[200] = ""; //開啟資料庫,建立連線; if(sqlite3_open("test.db",&conn) != SQLITE_OK) { printf("無法開啟\n"); } //執行SQL,建立一張表; sprintf(sql,"CREATE TABLE test_for_cpp(id int,name varchar(20),age int)"); if(sqlite3_exec(conn,sql,NULL,NULL,&err_msg) != SQLITE_OK) { std::string strErrMsg(err_msg); std::string::size_type pos = 0; pos = strErrMsg.find("already exists"); if(std::string::npos != pos) { //資料表已存在,刪除表中資料; sprintf(sql,"delete from test_for_cpp"); if(sqlite3_exec(conn,sql,NULL,NULL,&err_msg) != SQLITE_OK) { printf("操作失敗,錯誤程式碼:%s",err_msg); return -1; } } else { printf("操作失敗,錯誤程式碼:%s",err_msg); return -1; } } //插入資料; int nColumn = sizeof(strName) / sizeof(strName[0]); for(int index = 0;index < nColumn;index++) { sprintf(sql, "INSERT INTO test_for_cpp (id, name, age) VALUES (%d, '%s', %d)", index, strName[index].c_str(), 20 + index); if (sqlite3_exec(conn, sql, NULL, NULL, &err_msg) != SQLITE_OK) { printf("操作失敗,錯誤程式碼: %s", err_msg); return -1; } } // 查詢; sprintf(sql, "SELECT * FROM test_for_cpp"); sqlite3_exec(conn, sql, &sqlite3_exec_callback, 0, &err_msg); //關閉連線; if(sqlite3_close(conn) != SQLITE_OK) { printf("無法關閉,錯誤程式碼:%s\n",sqlite3_errmsg(conn)); return -1; } return 0; }
第三:
函式引數說明:
sqlite3_exec的原型如下:
SQLITE_API int sqlite3_exec(
sqlite3*, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
第一個引數為sqlite3例項。
第二個引數為要執行的sql語句。
第三個引數為回撥函式的指標。因為這裡只是建立表和插入資料,並沒有資料返回,所以不需要填寫回調函式。以NULL代替。
第四個引數為回撥函式所要使用的引數。同第三條。
第五個引數為錯誤資訊。
第四:查詢到的結果圖如下