现在的位置: 首页 > 综合 > 正文

Windows 中 SQLite3 使用(转)

2013年04月20日 ⁄ 综合 ⁄ 共 4712字 ⁄ 字号 评论关闭

配置:

一、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

抱歉!评论已关闭.