C++增删改查sqlite入门
sqlite小巧好用,功能强大。
C++操作sqlite需要sqlite3.h,sqlite3.dll,sqlite3.lib
下载sqlite-dll-win32-x86-3071400.zip和sqlite-amalgamation-3071400.zip
前者可以得到sqlite3.dll和sqlite3.def后者可以得到源码sqlite3.h
后面说明如何编译sqlite3.def生成sqlite3.lib
运行时把sqlite3.dll复制到运行目录下。
编译sqlite3.def生成sqlite3.lib
设置环境变量:
PATH:D:\Program Files\vs08\VC\bin
(我的vc2008安装路径:D:\Program Files\vs08)
进入你的sqlite3.def目录执行:LIB /DEF:sqlite3.def /machine:IX86
如果提示:没有找到 mspdb80.dll
到D:\Program Files\vs08\Common7\IDE目录下
复制msobj80.dll,mspdb80.dll,mspdbcore.dll,mspdbsrv.exe
到D:\Program Files\vs08\VC\bin
sqlite相关工具参考:
http://greatverve.cnblogs.com/archive/2011/04/28/sqlite-start.html
url:http://greatverve.cnblogs.com/archive/2012/09/22/cpp-sqlite-start.html
C++操作sqlite需要sqlite3.h,sqlite3.dll,sqlite3.lib
下载sqlite-dll-win32-x86-3071400.zip和sqlite-amalgamation-3071400.zip
前者可以得到sqlite3.dll和sqlite3.def后者可以得到源码sqlite3.h
后面说明如何编译sqlite3.def生成sqlite3.lib
#include <sqlite3.h>
#include <iostream>
#include <string>
using namespace std;
bool createTable();//创建表
bool insert();
bool Delete();
bool update();
bool select();
int print_result_cb(void* data,int n_columns,char** column_values,char** column_names);
void print_row(int n_values, char** values);
sqlite3 *pDB = NULL;
char * errMsg = NULL;
int rc = 0;
int main()
{
string strConn = "D:/cpp/database/sqlite/test.db";
//打开一个数据库,如果改数据库不存在,则创建一个名字为databaseName的数据库文件
rc = sqlite3_open(strConn.c_str(), &pDB);
if(rc)
{
cout<<"打开数据库 "<<strConn<<" 失败"<< endl;
return 0;
}
try
{
//createTable();
//insert();
//Delete();
//update();
select();
sqlite3_close(pDB);
}
catch(exception &ex)
{
cout<<"error:"<<ex.what()<<endl;
}
catch(...)
{}
return 1;
}
bool createTable()
{
//插入一个表,返回值为SQLITE_OK为成功,否则输出出错信息
//函数参数:第一个为操作数据库的指针,第二句为SQL命令字符串
//第三个参数为callback函数,这里没有用,第四个参数为callback函数
//中的第一个参数,第五个为出错信息
int rc = sqlite3_exec(pDB, "create table tblTest(id int, name QString)", 0, 0, &errMsg);
if(rc == SQLITE_OK)
cout<< "创建表 tblTest 成功!" << endl;
else
cout<<"建表失败:"<<errMsg<< endl;
return true;
}
bool insert()
{
//往表中添加数据
int id = 1;
char name[] = "大气象";
char value[500];
//定义一条参数SQL命令,其中chn,eng为需要插入的数据
sprintf(value, "insert into tblTest(id, name)values(%d, '%s')", id, name);
rc = sqlite3_exec(pDB,value,0,0,&errMsg);
return 1;
}
bool Delete()
{
sqlite3_exec(pDB,"delete from tblTest where id = 100",0,0,&errMsg);
return 1;
}
bool update()
{
char *pSql = "update tblTest set name = ? where id = ?";
sqlite3_stmt *ppStmt;
if(SQLITE_OK != sqlite3_prepare_v2(pDB,pSql,strlen(pSql),&ppStmt,0))
{
cout<<"update tblTest : prepare sql error !!!"<<endl;
sqlite3_finalize(ppStmt);
return 0;
}
sqlite3_bind_text(ppStmt,1,"ok",-1,SQLITE_TRANSIENT); //绑定值到第一个?
sqlite3_bind_int(ppStmt,2,100); //绑定值到第二个?
int ret = -1 ;
while(ret != SQLITE_DONE)
{
ret = sqlite3_step(ppStmt);
}
sqlite3_reset(ppStmt);
sqlite3_finalize(ppStmt);
return 1;
}
bool select()
{
//查询一条记录
char value[500];
//定义一条查询语句,其中条件为当english为target时的中文记录
//print_result_cb为callback函数,在其中可以得到查询的结果,具体见下文
//sprintf(value,"select * from tblTest where name='%s'", "大气象");
sprintf(value,"select * from tblTest", "hello");
rc = sqlite3_exec(pDB,value,print_result_cb, 0, &errMsg);
if(rc == SQLITE_OK)
{
cout<<"select the record successful!"<<endl;
}
else
{
cout<<errMsg<<endl;
}
return 1;
}
//callback回调函数print_result_cb的编写,其中data为sqlite3_exec中的第四个参数
//第二个参数是栏的数目,第三个是栏的名字,第四个为查询得到的值得。
//这两个函数输出所有查询到的结果
//有多少列回调函数就会执行多少次。
int print_result_cb(void* data,int n_columns,char** column_values,char** column_names)
{
static int column_names_printed = 0;
int i;
if (!column_names_printed) //首次执行结果是列名
{
print_row(n_columns, column_names);
column_names_printed = 1;
}
print_row(n_columns, column_values);
return 0;
}
void print_row(int n_values,char** values)
{
int i;
for (i = 0; i < n_values; ++i)
{
if (i > 0)
{
printf("\t");
}
printf("%s", values[i]);
}
printf("\n");
}
#include <iostream>
#include <string>
using namespace std;
bool createTable();//创建表
bool insert();
bool Delete();
bool update();
bool select();
int print_result_cb(void* data,int n_columns,char** column_values,char** column_names);
void print_row(int n_values, char** values);
sqlite3 *pDB = NULL;
char * errMsg = NULL;
int rc = 0;
int main()
{
string strConn = "D:/cpp/database/sqlite/test.db";
//打开一个数据库,如果改数据库不存在,则创建一个名字为databaseName的数据库文件
rc = sqlite3_open(strConn.c_str(), &pDB);
if(rc)
{
cout<<"打开数据库 "<<strConn<<" 失败"<< endl;
return 0;
}
try
{
//createTable();
//insert();
//Delete();
//update();
select();
sqlite3_close(pDB);
}
catch(exception &ex)
{
cout<<"error:"<<ex.what()<<endl;
}
catch(...)
{}
return 1;
}
bool createTable()
{
//插入一个表,返回值为SQLITE_OK为成功,否则输出出错信息
//函数参数:第一个为操作数据库的指针,第二句为SQL命令字符串
//第三个参数为callback函数,这里没有用,第四个参数为callback函数
//中的第一个参数,第五个为出错信息
int rc = sqlite3_exec(pDB, "create table tblTest(id int, name QString)", 0, 0, &errMsg);
if(rc == SQLITE_OK)
cout<< "创建表 tblTest 成功!" << endl;
else
cout<<"建表失败:"<<errMsg<< endl;
return true;
}
bool insert()
{
//往表中添加数据
int id = 1;
char name[] = "大气象";
char value[500];
//定义一条参数SQL命令,其中chn,eng为需要插入的数据
sprintf(value, "insert into tblTest(id, name)values(%d, '%s')", id, name);
rc = sqlite3_exec(pDB,value,0,0,&errMsg);
return 1;
}
bool Delete()
{
sqlite3_exec(pDB,"delete from tblTest where id = 100",0,0,&errMsg);
return 1;
}
bool update()
{
char *pSql = "update tblTest set name = ? where id = ?";
sqlite3_stmt *ppStmt;
if(SQLITE_OK != sqlite3_prepare_v2(pDB,pSql,strlen(pSql),&ppStmt,0))
{
cout<<"update tblTest : prepare sql error !!!"<<endl;
sqlite3_finalize(ppStmt);
return 0;
}
sqlite3_bind_text(ppStmt,1,"ok",-1,SQLITE_TRANSIENT); //绑定值到第一个?
sqlite3_bind_int(ppStmt,2,100); //绑定值到第二个?
int ret = -1 ;
while(ret != SQLITE_DONE)
{
ret = sqlite3_step(ppStmt);
}
sqlite3_reset(ppStmt);
sqlite3_finalize(ppStmt);
return 1;
}
bool select()
{
//查询一条记录
char value[500];
//定义一条查询语句,其中条件为当english为target时的中文记录
//print_result_cb为callback函数,在其中可以得到查询的结果,具体见下文
//sprintf(value,"select * from tblTest where name='%s'", "大气象");
sprintf(value,"select * from tblTest", "hello");
rc = sqlite3_exec(pDB,value,print_result_cb, 0, &errMsg);
if(rc == SQLITE_OK)
{
cout<<"select the record successful!"<<endl;
}
else
{
cout<<errMsg<<endl;
}
return 1;
}
//callback回调函数print_result_cb的编写,其中data为sqlite3_exec中的第四个参数
//第二个参数是栏的数目,第三个是栏的名字,第四个为查询得到的值得。
//这两个函数输出所有查询到的结果
//有多少列回调函数就会执行多少次。
int print_result_cb(void* data,int n_columns,char** column_values,char** column_names)
{
static int column_names_printed = 0;
int i;
if (!column_names_printed) //首次执行结果是列名
{
print_row(n_columns, column_names);
column_names_printed = 1;
}
print_row(n_columns, column_values);
return 0;
}
void print_row(int n_values,char** values)
{
int i;
for (i = 0; i < n_values; ++i)
{
if (i > 0)
{
printf("\t");
}
printf("%s", values[i]);
}
printf("\n");
}
运行时把sqlite3.dll复制到运行目录下。
编译sqlite3.def生成sqlite3.lib
设置环境变量:
PATH:D:\Program Files\vs08\VC\bin
(我的vc2008安装路径:D:\Program Files\vs08)
进入你的sqlite3.def目录执行:LIB /DEF:sqlite3.def /machine:IX86
如果提示:没有找到 mspdb80.dll
到D:\Program Files\vs08\Common7\IDE目录下
复制msobj80.dll,mspdb80.dll,mspdbcore.dll,mspdbsrv.exe
到D:\Program Files\vs08\VC\bin
sqlite相关工具参考:
http://greatverve.cnblogs.com/archive/2011/04/28/sqlite-start.html
url:http://greatverve.cnblogs.com/archive/2012/09/22/cpp-sqlite-start.html
我这个博客废弃不用了,今天想寻找外链的时候,突然想到这个博客权重很高。
有需要免费外链的,留言即可,我准备把这个博客变成免费的友情链接站点。