#include "../stdafx.h"#include "sqlite3.h"#include "sqlitedb.h"#include <iostream>//#include "../PublicFunction/PublicFunctions.h"using namespace std;sqlite3 *db = NULL; //定义数据库连接const char *errMsg = 0; //定义错误信息char *zerrMsg = 0; //定义错误信息//打开数据库int open_db(){int rc = sqlite3_open("E:/Program code/SQLite code/sqlitejdbc.db",&db); //打开数据库if(rc != SQLITE_OK) //数据库打开失败{errMsg = sqlite3_errmsg(db); //获取错误信息cout<<errMsg<<endl;sqlite3_close(db); //关闭数据库连接return -1;}cout<<"open database successfully!"<<endl;return 0;}//创建表int create_table(){if(open_db() != 0){open_db();}char *sql = "create table tab(id int primary key ,name varchar(20) ,age int)";/**//执行创建表语句 参数一:数据库连接 参数二:需要执行的SQL语句 参数三:回调函数 参数四:回调函数的第一个参数 参数五:错误消息。回调函数的格式如下:int sqlite_callback(void* pvoid, 由 sqlite3_exec() 的第四个参数传递而来int argc, 表的列数char** argv, 指向查询结果的指针数组, 可以由 sqlite3_column_text() 得到char** col 指向表头名的指针数组, 可以由 sqlite3_column_name() 得到);说明:sqlite3_exec() 的回调函数必须按照此格式, 当然形参的名字任意.如果某列的数据类型不是char*, 则可以对结果执行相关的转换, 如:用atoi()把结果转换为整数(integer), 如果是二进制数据, 则可以直接强制类型转换, 如:(void*)argv[i].该回调函数有两种返回值类型.1.返回零:sqlite3_exec() 将继续执行查询.2.返回非零:sqlite3_exec()将立即中断查询, 且 sqlite3_exec() 将返回 SQLITE_ABORT.*/int rc = sqlite3_exec(db,sql,NULL,NULL,&zerrMsg);if(rc != SQLITE_OK){errMsg = sqlite3_errmsg(db);cout<<errMsg<<endl; // cout<<zerrMsg<<endl;sqlite3_close(db);return -1;}cout<<"创建表成功!"<<endl;return 0;}//删除表int drop_table(){if(open_db() != 0){open_db();}char *sql = "drop table tab";int rc = sqlite3_exec(db,sql,NULL,NULL,&zerrMsg);if(rc != SQLITE_OK){errMsg = sqlite3_errmsg(db);cout<<errMsg<<endl; // cout<<zerrMsg<<endl;sqlite3_close(db);return -1;}cout<<"删除表成功"<<endl;return 0;}//数据添加int insert_data(int id,char *name,int age){if(open_db() != 0){open_db();}sqlite3_stmt *stmt = NULL; //准备语句对象char *sql = "insert into tab(id,name,age) values(?,?,?)";/**参数一:数据库连接 参数二:需要执行的SQL语句 参数三:SQL的长度 参数四:准备语句对象参数三:如果nByte小于0,则函数取出zSql中从开始到第一个0终止符的内容;如果nByte不是负的,那么它就是这个函数能从zSql中读取的字节数的最大值。如果nBytes非负,zSql在第一次遇见’/000/或’u000’的时候终止参数五:上面提到zSql在遇见终止符或者是达到设定的nByte之后结束,假如zSql还有剩余的内容,那么这些剩余的内容被存放到pZTail中,不包括终止符*/int rc = sqlite3_prepare_v2(db,sql,strlen(sql),&stmt,NULL);if(rc != SQLITE_OK){errMsg = sqlite3_errmsg(db);cout<<errMsg<<endl;if(stmt){sqlite3_finalize(stmt);}sqlite3_close(db);return -1;}sqlite3_bind_int(stmt,1,id);//参数一:准备语句对象 参数二:序号(从1开始)参数三:字符串值 参数四:字符串长度 参数五:函数指针,SQLITE3执行完操作后回调此函数,通常用于释放字符串占用的内存。(这个函数指针参数具体怎么使用,我现在还不清楚sqlite3_bind_text(stmt,2,name,strlen(name),NULL);sqlite3_bind_int(stmt,3,age);/**statement准备好了以后,就是操作的执行了它的返回值相对有些特殊。返回SQLITE_BUSY表示暂时无法执行操作,SQLITE_DONE表示操作执行完毕(执行update, delete, insert等语句),SQLITE_ROW表示执行完毕并且有返回(执行select语句时)。当返回值为SQLITE_ROW时,我们需要对查询结果进行处理,SQLITE3提供sqlite3_column_*系列函数。*/if(sqlite3_step(stmt) != SQLITE_DONE){sqlite3_finalize(stmt);sqlite3_close(db);return -1;}cout<<"数据插入成功!"<<endl;sqlite3_reset(stmt);sqlite3_finalize(stmt);sqlite3_close(db);return 0;}//数据查询 根据id唯一性查询int search_data(int id){if(open_db() != 0){open_db();}char *sql = "select * from tab where id = ?";sqlite3_stmt *stmt = NULL;int rc = sqlite3_prepare_v2(db,sql,strlen(sql),&stmt,NULL);if(rc != SQLITE_OK){errMsg = sqlite3_errmsg(db);cout<<errMsg<<endl;if(stmt){sqlite3_finalize(stmt);}sqlite3_close(db);return -1;}sqlite3_bind_int(stmt,1,id);int nColumn = sqlite3_column_count(stmt); //获取数据库表的列数int type; //表字段所对应的类型rc = sqlite3_step(stmt);if(rc == SQLITE_ROW){for(int i=0;i<nColumn;i++){type = sqlite3_column_type(stmt,i);if(type == SQLITE_INTEGER){cout<<sqlite3_column_name(stmt,i)<<"\t"<<sqlite3_column_int(stmt,i)<<endl;}if(type == SQLITE_TEXT){cout<<sqlite3_column_name(stmt,i)<<"\t"<<sqlite3_column_text(stmt,i)<<endl;}else if(type == SQLITE_NULL){cout<<"no value"<<endl;}}}else if(rc == SQLITE_DONE){cout<<"select finish!"<<endl;}else{cout<<"select fail"<<endl;sqlite3_finalize(stmt);}sqlite3_finalize(stmt);sqlite3_close(db);return 0;}//数据查询 根据姓名批量查询int search_data(char *name){if(open_db() != 0){open_db();}char *sql = "select * from T_BookShelf";sqlite3_stmt *stmt = NULL;int rc = sqlite3_prepare_v2(db,sql,strlen(sql),&stmt,NULL);if(rc != SQLITE_OK){errMsg = sqlite3_errmsg(db);cout<<errMsg<<endl;if(stmt){sqlite3_finalize(stmt);}sqlite3_close(db);return -1;}sqlite3_bind_text(stmt,1,name,strlen(name),NULL);int nColumn = sqlite3_column_count(stmt);int type;rc = sqlite3_step(stmt);//如果是select语句,且有还有记录,则应该返回SQLITE_ROWwhile(true) {if(rc == SQLITE_ROW){cout<<"--------------"<<endl;for(int i=0;i<nColumn;i++){type = sqlite3_column_type(stmt,i);if(type == SQLITE_INTEGER){cout<<sqlite3_column_name(stmt,i)<<"\t"<< sqlite3_column_int(stmt,i)<<endl;}if(type == SQLITE_TEXT){cout<<sqlite3_column_name(stmt,i)<<"\t"<< sqlite3_column_text(stmt,i)<<endl;}else if(type == SQLITE_NULL){cout<<"no value"<<endl;}}}else if(rc == SQLITE_DONE){cout<<"select finish!"<<endl;}else{cout<<"select fail"<<endl;sqlite3_finalize(stmt);}if (sqlite3_step(stmt) != SQLITE_ROW)break;}sqlite3_finalize(stmt);sqlite3_close(db);return 0;}//删除数据int delete_data(int age){if(open_db() != 0){open_db();}char *sql = "delete from tab where age = ?";sqlite3_stmt *stmt = NULL;int rc = sqlite3_prepare_v2(db,sql,strlen(sql),&stmt,NULL);if(rc != SQLITE_OK){errMsg = sqlite3_errmsg(db);cout<<errMsg<<endl;if(stmt){sqlite3_finalize(stmt);}sqlite3_close(db);return -1;}sqlite3_bind_int(stmt,1,age);rc = sqlite3_step(stmt);//如果是update, delete, insert等语句,正常应该返回 SQLITE_DONEif(rc == SQLITE_DONE)//SQLITE_DONE意味着已成功完成执行该语句{cout<<"删除数据成功"<<endl;}sqlite3_finalize(stmt);sqlite3_close(db);return 0;}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。