Chinaunix首页 | 论坛 | 博客
  • 博客访问: 315334
  • 博文数量: 163
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: -40
  • 用 户 组: 普通用户
  • 注册时间: 2017-03-08 00:28
文章分类

全部博文(163)

文章存档

2015年(2)

2014年(35)

2013年(28)

2012年(30)

2011年(22)

2010年(14)

2009年(8)

2008年(13)

2007年(11)

分类: C/C++

2009-09-09 17:49:11

最近突然有点空了,研究了下开源的桌面型数据库sqlite,由于只看了两天,加上在网上搜索了些东西,认识可能不是特别深,在此贴出来,与大家分享下,愿与大家共同进步.
 
首先就是下载sqlite3.
网上有很多资源,不过呢,我觉得最好的,还是在官网上下载。
官网下载地址
    应用程序版本:
    动态库版本  :
 
应用程序版本的,解压后,可以直接用命令行方式启动.  在程序控制台上可以直接使用.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;
}
 
我只在上面最需要注意的地方加了注释,如果有什么问题,欢迎联系我,大家一起研究下。
 
作者   :hnynes
MSN    :hnynes@gmail.com
阅读(4023) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~