最近突然有点空了,研究了下开源的桌面型数据库sqlite,由于只看了两天,加上在网上搜索了些东西,认识可能不是特别深,在此贴出来,与大家分享下,愿与大家共同进步.

首先就是下载sqlite3.
网上有很多资源,不过呢,我觉得最好的,还是在官网上下载。
官网下载地址
应用程序版本:http://www.sqlite.org/sqlite-3_6_17.zip
动态库版本 :http://www.sqlite.org/sqlitedll-3_6_17.zip

应用程序版本的,解压后,可以直接用命令行方式启动. 在程序控制台上可以直接使用.help,可以直接获取命令帮助. 这方面的内容比较简单,在此就不作过多的介绍了. 下面具体讲下使用动态库的方式,由于我主要使用的编程语言是C/C++,下面主要介绍C++下面的使用.

环境: win2003 + VS2005

首先解压 sqlitedll-3_6_17.zip,会得到两个文件sqlite3.def,sqlite3.dll
我们可以使用LoadLibrary加载dll文件,然后再获取函数地址,然后使用.
也可以使用LIB命令,创建一个导入库.
例如:解压后的文件路径为d:\sqlitedll-3.6.17
先运行一个CMD,将路径改到d:\sqlitedll-3.6.17,然后键入下面的命令
lib /DEF:D:\sqlitedll-3.6.17\sqlite3.def /MACHINE:IX86 并执行
会创建两个文件sqlite3.lib,sqlite3.exp
然后将目录改名为sqlite3,将目录复制到新建的工程下。在工作目录下的路径为
.\ProjectName\sqlite3

接下来的代码书写如下
// xxx.cpp

#include "stdafx.h"  
#include  
#include  
#include "sqllite3/sqlite3.h"  
#pragma comment(lib, ".\\sqllite3\\sqlite3")  
using namespace std;  
   
// 此函数为官方文档上的函数,没有作更改  
static int callback(void *NotUsed, int argc, char **argv, char **azColName)  
{  
    int i;  
    for(i=0; i        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");  
    }  
    printf("\n");  
    return 0;  
}  
   
int _tmain(int argc, _TCHAR* argv[])  
{  
    sqlite3 *db;  
    char *szErrMsg = 0;  
    int rc;  
    char *szDBName = "MyDB.sqlite3";  
    // 打开一个数据库,若数据库不存在,则会创建  
    rc = sqlite3_open(szDBName, &db);  
    if (rc)  
    {  
        std::cout << "Can't open database: " << szDBName << std::endl;  
        sqlite3_close(db);  
        system("PAUSE");  
        return -1;  
    }  
    char szStrSql[1024] = {0};  
    /* 这段被注释的代码,是添加数据的,由于设置了主键,可能会在第二次运行时报错,可注释  
    memset(szStrSql, 0, sizeof(szStrSql));  
    sprintf_s(szStrSql, sizeof(szStrSql), "create table UserInfo(UserID integer,UserName text,Sex integer,Age integer,primary key(UserID asc));");  
    rc = sqlite3_exec(db, szStrSql, callback, 0, &szErrMsg);  
    if (rc != SQLITE_OK)  
    {  
        std::cout << "SQL error: " << szErrMsg << std::endl;  
        sqlite3_free(szErrMsg);  
        szErrMsg = NULL;  
        sqlite3_close(db);  
        system("PAUSE");  
        return -1;  
    }  
    for (int i = 0; i < 10; ++i)  
    {  
        memset(szStrSql, 0, sizeof(szStrSql));  
        sprintf_s(szStrSql, sizeof(szStrSql), "insert into UserInfo values(%d, \'xn\', %d,%d);",  
            i + 1, i + 1, i + 1);  
        rc = sqlite3_exec(db, szStrSql, callback, 0, &szErrMsg);  
        if (rc != SQLITE_OK)  
        {  
            std::cout << "SQL error " << szErrMsg << std::endl;  
            sqlite3_free(szErrMsg);  
            szErrMsg = NULL;  
        }  
    }  
    */  
    char **pszResult = 0;  
    int nRow = 0;  
    int nColumn = 0;  
    memset(szStrSql, 0, sizeof(szStrSql));  
    sprintf_s(szStrSql, sizeof(szStrSql), "select UserID,UserName from UserInfo;");  
    //rc = sqlite3_exec(db, szStrSql, callback, 0, &szErrMsg);  
    // 获取上面sql语句指定的记录集  
    rc = sqlite3_get_table(db, szStrSql, &pszResult, &nRow, &nColumn, &szErrMsg);  
    if (rc != SQLITE_OK)  
    {  
        std::cout << "SQL error " << szErrMsg << std::endl;  
        sqlite3_free(szErrMsg);  
        szErrMsg = NULL;  
        sqlite3_free_table(pszResult);  
        sqlite3_close(db);  
        return -1;  
    }  
    else  
    {  
        // 此记录集成功获取后,最前面的nColume个元素是列名  
        // 因此,在做循环读取记录是,行数是比返回的行数多一行,存放列名  
        printf("表格共%d 记录!\n", nRow);  
        printf("表格共%d 列!\n", nColumn);  
        int index = nColumn;  
        for (int i = 0; i <= nRow; ++i)  
        {  
            for (int j = 0; j < nColumn; ++j)  
            {  
                std::cout << *(pszResult + nColumn * i + j) << "\t";  
            }  
            std::cout << std::endl;  
        }  
    }  
    if (szErrMsg != NULL) sqlite3_free(szErrMsg);  
    szErrMsg = NULL;  
    sqlite3_free_table(pszResult);  
    sqlite3_close(db);  
   
    system("PAUSE");  
    return 0;  
}  

我只在上面最需要注意的地方加了注释,如果有什么问题,欢迎联系我,大家一起研究下。