最近突然有点空了,研究了下开源的桌面型数据库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