Windows 中 SQLite3 使用(轉)

配置:

一、SQLite3 簡介

    SQLite3 是一個開源免費的嵌入式關係數據庫,它在 2000 年由 D. Richard Hipp 發佈,它不像大型數據庫管理系統,佔用系統大量資源。SQLite3 是用 C 語言編寫的開源數據庫,可移植性好,容易使用、輕型、高效、可靠,主要用在嵌入式系統中,由於其便利性,目前很多桌面程序也使用了 SQLite3,如:360 殺毒,金山毒霸等。SQLite3 基本支持 SQL92 標準。如:索引、限制、觸發和查看支持。支持 NULL、INTEGER、REAL、TEXT、BLOB 數據類型,支持事物。

 

二、使用版本

本文使用的 SQLite3 版本爲:3.6.23.1

下載地址:http://www.sqlite.org/download.html

在使用中,一般下載兩個壓縮包即可:sqlite-amalgamation-3_6_23_1.zip、sqlitedll-3_6_23_1.zip

 

三、配置

    在 Windows 中,使用第三方庫有很多種方式,大多數軟件使用動態 dll、使用靜態導入庫、使用靜態鏈接庫。由於下載的壓縮包中,本來就有 sqlite3.dll 文件,使用起來也十分方便,所以本文主要講解後面兩種方式的配置。

 

1、使用靜態導入庫

靜態導入庫也稱爲輸入庫,是目標庫文件的一種特殊形式。像目標庫一樣,輸入庫有 .lib 擴展名,並且被鏈接程序用來確定源程序代碼中的函數調用。導入庫不含代碼,而是爲連接程序提供信息,以便在 .exe 文件中建立動態鏈接時要用到的重定位表。

在下載的壓縮包中,沒有導入庫,所以我們需要自己編譯,編譯過程如下:

1、  將壓縮包 sqlitedll-3_6_23_1.zip 解壓到一個目錄。

2、  拷貝 VS2005 中 lib.exe、link.exe、mspdb80.dll 到剛纔解壓的目錄。VS2005 中文件的路徑爲:C:/Program Files/Microsoft Visual Studio 8/VC/bin、C:/Program Files/Microsoft Visual Studio 8/VC/bin

3、  打開 CMD 窗口,切換到對應的目錄,輸入:LIB /DEF:sqlite3.def /machine:IX86

編譯之後,便會在本地目錄中產生 sqlite3.lib 導入庫文件,將此庫鏈接入程序,另一個壓縮包中有 sqlite3.h 頭文件,這兩個文件配合使用,如果本地有 sqlite3.dll ,便可以通過靜態導入庫來使用 SQLite3 了。

 

2、使用靜態鏈接庫

靜態鏈接庫也稱爲目標庫,是帶 .lib 擴展名的文件。在用鏈接程序進行靜態鏈接時,它的代碼就會加到程序的 .exe 文件中。

下載的安裝包中,也不存在靜態鏈接庫,所以我們也需要自己編譯,編譯過程如下:

1、  用 VS2005 建立一個名爲 sqlite3 的靜態鏈接庫工程。

2、  將壓縮包中的文件 sqlite3.c、sqlite3.h 添加入工程,將輸出文件名改爲 sqlite3.lib,編譯。

編譯之後,便會在設置的目錄中產生 sqlite3.lib 靜態鏈接庫,通過本 lib 文件與 sqlite3.h 文件,便可以使用 SQLite3 了,此處可以看到,使用時並不需要 sqlite3.dll 文件。

注:VS2005 默認的編譯模式爲“/MD”,如果要完全不依賴於其他dll,可以設置爲“/MT”。

 

四、查看數據庫

SQLite 官網有查看的工具,使用後感覺不方便,也不友好。在此推薦一個工具 SQLiteSpy,提供圖形界面方式查看 SQLite3 數據庫,操作方式十分簡單,只要見 SQLite 數據庫文件直接打開即可,想必您一定會用。

下載地址:http://www.yunqa.de/delphi/sqlitespy/

 

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/xt_xiaotian/archive/2010/04/06/5453686.aspx

 

 

基本導出函數

一、概述

SQLite3 的最常使用基本導出函數有五個:

sqlite3_open:打開(鏈接到) SQLite3 數據庫。

sqlite3_close:關閉 SQLite3 數據庫連接。

sqlite3_exec:對於已打開的數據庫連接,執行 SQL 語句。

sqlite3_get_table:對於已打開的數據庫連接,查詢數據庫。

sqlite3_free:釋放 SQLite 內部分配的內存。

 

二、使用

SQLite3 使用非常簡單,像 Windows 大部分 API 一樣,先打開對應的資源,獲得句柄,然後對資源進行操縱,最後關閉句柄。

下面的代碼演示其過程(代碼中含有大量註釋,具體函數調用過程可看註釋):

#include "stdafx.h"

#include "sqlite3.h"

#include <windows.h>

#pragma comment(lib, "sqlite3.lib")

 

void PrintInfo(LPCSTR* pPrintInfo, int nRows, int nCols)

{

     LPCSTR lpszTemp = NULL;

     for (int nRowIndex = 0; nRowIndex <= nRows; nRowIndex++)     // nRowIndex = 0 時,查找到的是表頭

     {

         for (int nColIndex = 0; nColIndex < nCols; nColIndex++)

         {

              lpszTemp = *(pPrintInfo + nRowIndex * nCols + nColIndex);    // 信息是直接累加的,前面是表頭

              if (lpszTemp)

              {

                   printf(lpszTemp);

                   printf("/n");

              }

         }

         printf("---------------------------------------/n");

     }

     printf("=======================================================/n");

}

 

void main()

{

     sqlite3* pSQLite = NULL;

     int nRet = 0;

     LPCSTR lpszSQL1 = "create table people(name varchar(20), age int, birthday datetime);";      // 創建表格people 的SQL 語句

     LPCSTR lpszSQL2 = "insert into people values('wang',20,'1990-6-3');";                        // 插入信息的SQL 語句

     LPCSTR lpszSQL3 = "insert into people values('li',21,'1989-3-2');";

     LPCSTR lpszSQL4 = "select * from people;";                                                             // 查找表格people 的所有信息的SQL 語句

     LPCSTR lpszSQL5 = "delete from people where name='wang';";                                        // 刪除姓名爲"wang" 的信息

     LPSTR* plpszResult = NULL;

     int nRows = 0;

     int nCols = 0;

 

     nRet = sqlite3_open("C://SQLite3_Test.db", &pSQLite);   // 鏈接到數據庫,如果成功,數據庫句柄指針存儲於pSQLite 中

     if (nRet != SQLITE_OK)                                       // 函數返回SQLITE_OK 表示連接成功,否則直接退出連接

         goto Exit0;

 

     nRet = sqlite3_exec(pSQLite, lpszSQL1, NULL, NULL, NULL);        // 執行SQL 語句,創建people 表

     if (nRet != SQLITE_OK)

         goto Exit0;

 

     nRet = sqlite3_exec(pSQLite, lpszSQL2, NULL, NULL, NULL);        // 執行SQL 語句,將信息插入表格

     if (nRet != SQLITE_OK)

         goto Exit0;

 

     nRet = sqlite3_exec(pSQLite, lpszSQL3, NULL, NULL, NULL);

     if (nRet != SQLITE_OK)

         goto Exit0;

 

     nRet = sqlite3_get_table(pSQLite, lpszSQL4, &plpszResult, &nRows, &nCols, NULL);    // 查詢表格中所有信息

     if (nRet != SQLITE_OK)

         goto Exit0;

 

     PrintInfo((LPCSTR*)plpszResult, nRows, nCols); // 輸出查詢到的信息

 

     nRet = sqlite3_exec(pSQLite, lpszSQL5, NULL, NULL, NULL);    // 刪除姓名爲"wang" 的信息

     if (nRet != SQLITE_OK)

         goto Exit0;

 

     nRet = sqlite3_get_table(pSQLite, lpszSQL4, &plpszResult, &nRows, &nCols, NULL);

     if (nRet != SQLITE_OK)

         goto Exit0;

 

     PrintInfo((LPCSTR*)plpszResult, nRows, nCols); // 當刪除一項後,再打印出數據庫中的信息

 

Exit0:

     if (plpszResult)

     {

         if (*plpszResult)

         {

              sqlite3_free(*plpszResult);

              *plpszResult = NULL;

         }

     }

 

     if (pSQLite)

     {

         sqlite3_close(pSQLite);     // 關閉SQLite 數據庫連接

         pSQLite = NULL;

     }

     DeleteFile("C://SQLite3_Test.db");   // 刪除用於測試的文件

     return;

}

 

三、使用時的線程安全

在 Windows 中,SQLite3 是線程安全的,但使用時也必須遵守規定:一個 sqlite3 結構體指針,只能在一個線程中使用,如果需要將此 sqlite3 結構體傳遞給其他線程,則必須先複製一份,然後傳遞。

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/xt_xiaotian/archive/2010/04/06/5453696.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章