1. 程式人生 > >在VS2010下c++與Sqlite3的連線

在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代替。
第四個引數為回撥函式所要使用的引數。同第三條。
第五個引數為錯誤資訊。

第四:查詢到的結果圖如下