irpas技术客

SQLite数据库使用(sqlite3 c++)_PC1022_c++ sqlite3使用

未知 1447

本文只针对sqlite3 c++ API调用。 1、基础知识

sqlite3只是一个嵌入式数据库引擎,占用资源非常底,可以适用于Windows和Linux,而且sqlite3只是一个文件,不需要服务器进程。

sqlite3 c++ api接口只需要引用sqlite3.h头文件就行。

常用术语:表(table)、字段(column,列,属性)、记录(row,record)。

存储类型:integer(整型)、real(浮点型)、text(文本字符串)、blob(二进制数据)。

关键字:select、insert、update、delete、from、creat、where、desc、order、by、group、table、alter、view、index等,数据库中不能使用关键字命名表和字段。

2、数据库语句 2.1、创建或打开数据库

对应c++代码

//不存在即创建数据库 sqlite3* db; int res = sqlite3_open(sql_name,&db); if(res) { fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); qDebug() << "database failed to open "; } else{ qDebug() << "database open sucess"; } 2.2、数据定义语句 新建表 ??create:create table 表名 (字段名1 字段类型1,字段名2 字段类型2,。。。); create table if not exists 表名?(字段名1 字段类型1,字段名2 字段类型2,。。。);

?  CREATE TABLE IF NOT EXISTS t_person (id?integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);?

删除表 ? drop:dorp table 表名;drop table if exists 表名;

  ?DROP TABLE IF EXISTS t_person;?

对应c++代码:

//回调函数 static int callback(void *NotUsed, int argc, char **argv, char **azColName){ int i; for(i=0; i<argc; i++){ printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } //判断表是否存在 /* Create SQL statement */ char *sql = "CREATE TABLE IF NOT EXISTS COMPANY(" \ //只是创建表 "CREATE TABLE COMPANY(" "ID INT PRIMARY KEY NOT NULL," \ "TIME_START TEXT NOT NULL," \ "TIME_END TEXT NOT NULL," \ "DETECT_IP TEXT NOT NULL," \ "CONTAINER_NUM TEXT NOT NULL," \ "REAL_RESULTS TEXT NOT NULL," \ "DETECT_RESULTS TEXT NOT NULL," \ "DETECT_TIME TEXT NOT NULL," \ "NOTE TEXT NOT NULL);"; /* Execute SQL statement */ char *zErrMsg = 0; int rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); if( rc != SQLITE_OK ){ fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); }else{ fprintf(stdout, "Table created successfully\n"); } //若存在则删除表 /* drop SQL statement */ char *sql_d = "DROP TABLE IF EXISTS COMPANY;"; //删除表不做判断 "DROP TABLE COMPANY(" /* Execute SQL statement */ char *zErrMsg = 0; int rc = sqlite3_exec(db, sql_d, NULL, 0, &zErrMsg); if( rc != SQLITE_OK ){ fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); }else{ fprintf(stdout, "Table drop successfully\n"); } 2.3、数据操作语句 添加表中的数据?? insert:insert into 表名 (字段1,字段2,。。。) values (字段1的值,字段2的值);字符串内容用单引号。

  ?INSERT INTO t_person (name, age) VALUES ('大明',?22);?

修改表中的数据?? update:update 表名 set 字段1 = 字段1的值,字段2 = 字段2的值,。。。;

  ??UPDATE t_person SET name =?'小明', age =?10;?//?把表中name字段的值全部改成小明,age字段的值全部改成10。??

  ??UPDATE t_person SET age =?12?WHERE name =?'小明';?//?把表中name字段值是小明的age值改为12。??

删除表中的数据?? delete:delete from 表名;delete from 表名 where 字段 = 字段值。

  ?DELETE FROM t_person;?//?删除表中的所有记录。?

  ?DELETE FROM t_person WHERE age =?25;?//?删除表中字段age等于25的这条记录。?

  ?DELETE FROM t_person WHERE age >?12?AND age <?15;?//?删除表中年龄大于12且小于15的记录。?

写入数据方式一:

sqlite3* db; int res = sqlite3_open(sql_name,&db); if(res) { fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); qDebug() << "database failed to open "; } else{ qDebug() << "database2 open sucess"; } /* INSERT SQL statement */ ID += 1; time_start =QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz").toLongLong(); time.start(); char *zErrMsg = 0; std::string local_ip = "'192.168.53.21'"; int64_t time_end =QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz").toLongLong(); std::string container_num = "'#^XH^123456^42G1^'"; QString isEmptoy = "'空箱'"; //char detect_results = 0x00; std::string detect_results_sql; std::string note = "''" ; qDebug()<< "detect_results : "<<detect_results; detect_results_sql = "'未执行检测'"; note = "'设备防夹保护触发,设备停止运动'"; int timeElapsed = time.elapsed(); qDebug()<< "timeElapsed : "<<timeElapsed<<" ms"; //float detect_time = float(time_end -time_start)/1000; float detect_time = float(timeElapsed)/1000; std::string sql_add = "INSERT INTO COMPANY (ID,TIME_START,TIME_END,DETECT_IP,CONTAINER_NUM,REAL_RESULTS,DETECT_RESULTS,DETECT_TIME,NOTE) " "VALUES(" + std::to_string(ID)+","+ std::to_string(time_start)+","+ std::to_string(time_end)+","+local_ip+"," ""+container_num+","+isEmptoy.toStdString()+","+detect_results_sql+","+std::to_string(detect_time)+","+note+"); " ; /* Execute SQL statement */ int rc = sqlite3_exec(db, sql_add.c_str(), callback, 0, &zErrMsg); if( rc != SQLITE_OK ){ fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); }else{ fprintf(stdout, "INSERT2 created successfully\n"); } sqlite3_close(db); }

写入数据方式二:

第二种写入数据的方式------------------------------------------ sqlite3_exec(db,"begin;",0,0,0); int64_t time_start =QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz").toLongLong(); std::string local_ip = "192.168.53.21"; sqlite3_stmt *stmt; const char* sql_insert = "INSERT INTO COMPANY (ID,TIME_START,DETECT_IP) VALUES(?,?,? );" ; int ret = sqlite3_prepare_v2(db,sql_insert,-1,&stmt,0); if(ret == SQLITE_OK) { sqlite3_bind_int(stmt,1,1); sqlite3_bind_int64(stmt,2,time_start); //sqlite3_bind_text(stmt,2,local_ip.c_str(),-1,SQLITE_STATIC); sqlite3_bind_text(stmt,3,local_ip.c_str(),-1,SQLITE_STATIC); ret = sqlite3_step(stmt); // if(rc != SQLITE_DONE) // { // fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db)); // sqlite3_close(db); // } sqlite3_reset(stmt); sqlite3_finalize(stmt); } else { fprintf(stderr, "SQL error: %s\n", zErrMsg); } sqlite3_exec(db,"commit;",0,0,0); sqlite3_free(zErrMsg); 2.3查询数据 select:select 字段1, 字段2, 。。。 from 表名;select 字段1, 字段2, 。。。 from 表名 where 字段 = 某值;select * from 表名;(查询所有的字段)表别名:select 字段1 别名, 字段2 别名,。。。from 表名 别名;select 字段1 别名, 字段2 as 别名,。。。from 表名 as 别名;select 别名.字段1,别名.字段2,。。。from 表名 别名;

  ?SELECT name, age FROM t_person WHERE age <?80;?

?  SELECT * FROM t_person WHERE age <?80;?

  ?SELECT name, age nianling FROM t_person ren WHERE ren.age >?80?AND nianling <?90;?

计算记录条数:select count(字段或者*) from 表名;

  ?SELECT count(name) FROM t_person ren WHERE ren.age >?80;?

  ?SELECT count(*) FROM t_person ren WHERE ren.age >?80;?

where:where 字段 = 某值;where 字段 is 某值;where 字段 != 某值;where 字段 is not 某值;where 字段 > 某值;where 字段1 = 某值1 and 字段2 < 某值2;where 字段1 = 某值1 or 字段2 > 某值2;order by:select * from 表名 order by 字段(默认升序);select * from 表名 order by 字段 desc(降序);select * from 表名 order by 字段 asc(升序);select * from 表名 order by 字段1 asc(先按字段1升序),字段2 desc(再按字段2降序);

  ?SELECT * FROM t_person WHERE age <?100?ORDER BY age DESC, name ASC;?//?先按年龄降序,再按名字升序。??

limit:select * from 表名 limit 数值1,数值2;分页查询,数值1表示跳过前面多少条,数值2表示取出之后多少条。select * from 表名 limit 数值2;(跳过前面0条,相当于select * from 表名 limit 0,数值2,表示最前面多少条数据)

  ?SELECT * FROM t_person WHERE age <?100?ORDER BY age DESC, name ASC LIMIT?3,?5;?//?先筛选,后排序,再分页。?

like:模糊查询,select 字段1, 字段2, 。。。 from 表名 where 字段 like %某值%;

  ?SELECT * FROM t_person WHERE name like?'%明%';?

查询ID:(用处:获取当前数据库的所写的行数)

//获取当前数据库最大ID值 char **dbresult; int nrow,ncolumn; char *sql_select = "SELECT * from COMPANY"; res = sqlite3_get_table(db,sql_select,&dbresult,&nrow,&ncolumn,&zErrMsg); if(res == SQLITE_OK) { //查询成功 ID = nrow; qDebug() << "nrow :" << nrow; } else{ fprintf(stderr, "SQL error: %s\n", zErrMsg); qDebug() << "SELECT error :" ; } //释放 dbresult 的查询结果 sqlite3_free_table(dbresult); 3、Ubuntu和nano安装sqlite3 3.1、Ubuntu安装sqlite3 sudo apt-get install sqlite3 //查看版本信息 sqlite3 -version 3.2、nano安装sqlite3

使用apt在Nano上安装,但是找不到sqlite3.h,所以只能使用源码编译。

下载源码:SQLite Download Page

//解压 tar xvzf sqlite-autoconf-3310100.tar.gz //进入sqlite文件夹 cd sqlite-autoconf-3310100 //配置文件 ./configure //开始编译 make //写入系统文件中 sudo make install //查看文件路径 dpkg -L sqlite3


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #C #sqlite3使用 #本文只针对sqlite3 #API调用 #sqlite3