1. 程式人生 > >關於VC++中sqlite3的配置和簡單使用小結

關於VC++中sqlite3的配置和簡單使用小結

公司突然要我們搞sqlite3資料庫,對於這方面一無所知,在網上搜集了諸多資料才終於配置好了,之前一直被誤導。

在官網上(非官網也行)去下載sqlite3,不是sqlite3.exe,而是下載的包,一般下載的包是sqlite3.h、sqlite3.dll和sqlite3.def。

1、把sqlite3.h放進工程中,並在工程檔案需要呼叫sqlite3函式的地方新增標頭檔案#include “sqlite3.h”。

2、把sqlite3.dll也放進工程中,不然的話,無法啟動程式,會顯示無法找到sqlite3.dll。

3、利用sqlite3.def生成sqlite3.lib檔案,具體方法為:

1)找到VC安裝盤的目錄下,我安裝在E盤,E:\Program Files\Microsoft Visual Studio\VC98\Bin下,切換到該目錄下

2)利用LIB.EXE生成.lib檔案,使用時需要注意一點,路徑要寫全,包括輸出路徑。例如下面一個完整的命令列:

E:\Program Files\Microsoft Visual Studio\VC98\Bin>LIB /out:D:\test\sqlite3.lib /MACHINE:IX86 /DEF:D:\test\sqlite3.def

執行完這個命令後,你會在D:\test\下發現sqlite3.lib和sqlite3.exp兩個檔案。這樣的話,就可以了。

sqlite3.lib已經生成了,但是還需要將這個lib檔案放進VC6主機安裝路徑的lib資料夾下,我的是E:\Program Files\Microsoft Visual Studio\VC98\lib下。

或者開啟VC程式,進入Tools選單->options->directories,設定此檔案放置路徑。

此時,雖然一切都已經弄好了,但是當你呼叫它的庫函式時,還會出現一個錯誤就是:

sqlite.obj : error LNK2001: unresolved external symbol _sqlite3_free_table
sqlite.obj : error LNK2001: unresolved external symbol _sqlite3_get_table
sqlite.obj : error LNK2001: unresolved external symbol _sqlite3_exec


sqlite.obj : error LNK2001: unresolved external symbol _sqlite3_close
sqlite.obj : error LNK2001: unresolved external symbol _sqlite3_errmsg
sqlite.obj : error LNK2001: unresolved external symbol _sqlite3_open

這是因為我們的工程中沒有加入外部的lib檔案導致的,需要在工程->設定->link中的lib中添加了sqlite3.lib,這樣就好了。

當一切都完成之後就可以使用sqlite3中的庫函數了。

sqlite3使用中需要注意,對於插入修改刪除我就不說了,這幾個函式就那幾個用法,不需要回調函式,只需要在執行時判斷exec的返回結果是否為SQLITE3_OK。

對了exec函式也說明一下吧。

1、int sqlite3_exec(sqlite3*, const char *sql,sqlite3_callback, void *,  char **errmsg );

這個函式是執行一條sql語句的函式,

第一個引數是open函式得到的指標,這個我們無需操心

第二個函式constchar *sql是我們需要執行的sql語句,以‘\0’結尾,注意它的型別,是const char*型別的。

第三個引數sqlite3_callback是回撥函式,當執行完這條語句之後,sqlite3會呼叫提供的這個回撥函式,當不需要回調函式時,可以為NULL

個引數void * 是你所提供的指標,你可以傳遞任何一個指標引數到這裡,這個引數最終會傳到回撥函式裡面,如果不需要傳遞指標給回撥函式,可以填NULL

第五個引數是錯誤資訊,注意型別是char**。

注:當不需要回調函式時,第三個和第四個引數可以設定為NULL,像上面說的插入修改刪除等不需要回調函式的,但是像查詢需要回調函式,因為要檢視查詢的結果如何。

2、exec回撥函式

typedef int (*sqlite3_callback)(void* para,intn_column,char** column_value, char** column_name);

這是exec執行sql語句後的回撥函式,每當查到一條資料時,就呼叫這個回撥函式一次。

注:

para是exec傳入的指標,也就是exec的第四個引數(注意該函式中的型別是void*型別的,需要轉化成自己所需的型別才能使用);

n_column這是記錄該跳記錄有多少個欄位;

column_value查詢出來的資料儲存在這裡,實際上是一個一維陣列,每個元素都是char*值,是一個欄位的內容;

column_name是與column_value對應的欄位名稱。

當呼叫該回調函式時,我經過小測試得知,當執行的查詢語句或者條件查詢返回的記錄數為0時,是不會進入到回撥函式的。所以在某些時候需要根據查詢結果來對資料庫進行操作的時候用回撥函式還是不太方便,例如:當使用條件查詢某條資料是否在資料庫中,如果存在則修改該條記錄,如果不存在則插入該條記錄。這樣的話使用回撥函式就無法實現,可能是我現在對sqlite3還比較稚嫩,沒研究出來吧,等我發現瞭如何使用回撥函式操作後,再修改部落格內容。在此時就可以用下面這種方法來實現上面這個假設。

3、不使用回撥函式查詢資料庫(此下為轉載)

函式宣告如下:

int sqlite3_get_table(sqlite3*, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg);

第1個引數同上

第2個引數是 sql 語句,跟 sqlite3_exec 裡的 sql 是一樣的。是一個很普通的以/0結尾的char *字串。

第3個引數是查詢結果,它依然一維陣列(不要以為是二維陣列,更不要以為是三維陣列)。它記憶體佈局是:第一行是欄位名稱,後面是緊接著是每個欄位的值。

第4個引數是查詢出多少條記錄(即查出多少行)。

第5個引數是多少個欄位(多少列)。

第6個引數是錯誤資訊

下面給個簡單例子:

int main( int , char ** )

{

   sqlite3 * db;

   int result;

   char * errmsg = NULL;

   char **dbResult; // char ** 型別,兩個*號

   int nRow, nColumn;

   int i , j;

   int index;

   result = sqlite3_open( “c://Dcg_database.db”,&db );

   if( result != SQLITE_OK )

   {

        //資料庫開啟失敗

        return-1;

   }

   //資料庫操作程式碼

   //假設前面已經建立了 MyTable_1 

   //開始查詢,傳入的 dbResult 已經是 char **,這裡又加了一個 & 取地址符,傳遞進去的就成了 char ***

   result = sqlite3_get_table(db, “select * from MyTable_1”,&dbResult, &nRow, &nColumn, &errmsg );

   if( SQLITE_OK ==result )

   {

        //查詢成功

    index = nColumn; //前面說過 dbResult 前面第一行資料是欄位名稱,從 nColumn 索引開始才是真正的資料

     printf( “查到%d條記錄/n”, nRow );

        for(  i= 0; i < nRow ; i++ )

        {

             printf( “第 %d 條記錄/n”,i+1 );

             for(j = 0 ; j < nColumn; j++ )

             {

                  printf( “欄位名:%s  ß> 欄位值:%s/n”,  dbResult[j],dbResult [index] );

                  ++index; // dbResult 的欄位值是連續的,從第0索引到第 nColumn - 1索引都是欄位名稱,從第 nColumn 索引開始,後面都是欄位值,它把一個二維的表(傳統的行列表示法)用一個扁平的形式來表示

             }

             printf( “-------/n” );

        }

   }

   //到這裡,不論資料庫查詢是否成功,都釋放 char** 查詢結果,使用 sqlite 提供的功能來釋放

   sqlite3_free_table(dbResult );

   //關閉資料庫

   sqlite3_close( db );

   return 0;

}

好了,先就到這裡吧,我接觸不多,等以後用的越來越多了再改進這篇文章。

相關推薦

關於VC++sqlite3配置簡單使用小結

公司突然要我們搞sqlite3資料庫,對於這方面一無所知,在網上搜集了諸多資料才終於配置好了,之前一直被誤導。 在官網上(非官網也行)去下載sqlite3,不是sqlite3.exe,而是下載的包,一般下載的包是sqlite3.h、sqlite3.dll和sqlite3.d

Spring集合(List,Set,Map)的配置簡單使用(一)

1、首先寫一個實體類 package com.listtest.test; import java.util.List; import java.util.Map; import java.util.Set; public class Collect {

Mac上安裝配置簡單使用PostgreSQL(仍然很不懂)

ui s 暫時 psql 控制 Go 修改 文本編輯 CI 推薦 因為想要使用推薦的rails-template。需要使用postgres。並初始化了一個用戶postgres,密碼是postgres。( e.g. $ createuser -d postgres ) 需要買

Redis 的安裝基本使用以及在 Django 專案配置使用

myRedis Redis的安裝好基本使用 環境 Python 3.6 Django 2.0.7 django-redis 4.9.0 Mac GitHub https://github.com/C

SSH入門Struts2篇(1)——Struts2的配置簡單示例

1.下載struts2.3並把核心jar包新增到WEB-INF/lib目錄下 struts2.3下載地址 核心jar包指的是以下八個,在這個簡單的例子裡我們暫時只需要這八個 2.struts的表單處理流程 對於一般的web應用而言,表單提交之後交給servl

springbean配置bean注入

轉自 https://www.cnblogs.com/wuchanming/p/5426746.html bean與spring容器的關係 Bean配置資訊定義了Bean的實現及依賴關係,Spring容器根據各種形式的Bean配置資訊在容器內部建立Bean定義

redis cluster配置簡單初始化

-------------環境安裝------------ #安裝redis wget http://download.redis.io/releases/redis-3.2.5.tar.gz tar xzf redis-3.2.5.tar.gz cd redis-3.2.

faster-rcnn配置訓練小結

論文:http://arxiv.org/abs/1506.01497 1.準備工作 類似於fast-rcnn http://blog.csdn.net/u010678153/article/details/46892911 2.安裝(用於demo) 2.1 從github

react native開發eslint配置初始化

先簡單介紹一下mac系統環境下,eslint的配置。 首先開啟命令列工具,cd到專案根目錄下。 一次輸入命令並等待下載完成。 npm install eslint --save-dev npm ins

FastDFS圖片伺服器配置簡單的案例

配置FastDFS的相關軟體 連結: https://pan.baidu.com/s/1Wnq9wPbNHwFL2i9kRv3imQ 提取碼: hmwh      下面是執行已經配置的圖片伺服器的相關步驟:  &nb

VS2013安裝配置使用Boost庫

時間:2014.07.24 地點:基地 -------------------------------------------------------------------------------------- 一、前言   今天準備去看場電影《後會無期》,但在這之前,我

Java框架學習_Spring(四)Spring_AOP相關術語、AOP_xml的配置簡單測試(涉及junitaop整合進階)

面向切面程式設計的感覺就是:以前程式是由上往下執行的,如果我需要新增一個什麼功能,就需要去改程式碼,但是我用AOP的動態代理,就像膠帶一樣,往上面一貼就行了,不要用的時候再撕下來,是橫向的,後面會有很多膠帶的型別(就是下面的Advice通知),往上貼,往下帖,環繞貼,遇到異常貼等等,就很方便

Mybatis框架mapper配置foreach標籤的使用

foreach標籤下面介紹一下一個mapper配置檔案中的foreach標籤(注意,要跟著前面的總結來看,這裡使用的例子是結合前面的工程寫的,大部分程式碼沒有再贅述)foreach的作用是向sql傳遞陣列或List,mybatis使用foreach解析1.1需求在使用者查詢列

Kafka訊息處理系統配置簡單使用

Kafka:Kafka是由Apache軟體基金會開發的一個開源流處理平臺,由Scala和Java編寫。Kafka是一種高吞吐量的分散式釋出訂閱訊息系統,它可以處理消費者規模的網站中的所有動作流資料。 這種動作(網頁瀏覽,搜尋和其他使用者的行動)是在現代網路上的許多社會功能的一

vc使用動態連結庫小結

一.  靜態庫包括.lib和.h檔案,在工程中使用靜態庫分為3步: <1> 在工程中加入靜態庫,有兩種方法:       **方法一:專案設定中引用.lib,project->   setting->   link->   object/

Android上ORMLite的配置簡單使用

ORMLite和GreenDao是Android上最流行的ORM(物件關係對映)框架 現在來簡單梳理下ORMLite在Android上的簡單使用 1.在官網下載jar包,將這兩個jar包放在libs目錄下,然後同步工程(也就是將這兩個jar包新增進libra

RecyclerView 使用Adapter配置Acticity的寫法

RecyclerView Adapter中的設定 public class HomePageFiledAdapter extends RecyclerView.Adapter { private

vcdll匯出匯入簡單教程

dll和lib的區別 未完待續 如何匯出dll 查閱msdn官方文件發現,匯出dll有三種方式,一種是使用.def檔案匯出,另一種是在程式碼中使用巨集__declspec(dllexport)匯出,最後一種是配置vc工程的屬性,使用LINK 命令中的

由JDBC淺談JNDI及其在WebSphere配置企業級應用DB Session在Spring下的管理

在J2EE規範中對JDBC和JNDI進行了充分說明。本文展現了兩者間的一點聯絡,概要陳述下在WebSphere中如何配置JNDI資料來源以及在應用中使用JNDI資料來源,同時結合Spring簡述應用中D

圖解VC++ opengl環境配置幾個入門例子

VC6下載 http://blog.csdn.net/bcbobo21cn/article/details/44200205 demo工程和glut庫下載 http://pan.baidu.com/s/1pLSpKiZ 一 環境配置 參閱 http://blog.itpu