收藏 分享(赏)

物联网仓储管理系统 Sqlite数据库连接 论文答辩.pptx

上传人:yjrm16270 文档编号:4836480 上传时间:2019-01-15 格式:PPTX 页数:32 大小:210.60KB
下载 相关 举报
物联网仓储管理系统 Sqlite数据库连接 论文答辩.pptx_第1页
第1页 / 共32页
物联网仓储管理系统 Sqlite数据库连接 论文答辩.pptx_第2页
第2页 / 共32页
物联网仓储管理系统 Sqlite数据库连接 论文答辩.pptx_第3页
第3页 / 共32页
物联网仓储管理系统 Sqlite数据库连接 论文答辩.pptx_第4页
第4页 / 共32页
物联网仓储管理系统 Sqlite数据库连接 论文答辩.pptx_第5页
第5页 / 共32页
点击查看更多>>
资源描述

1、Sqlite数据库连接,答辩:张小亮毕业院校:兰州交通大学2012.3.8,SQLITE操作入门,sqlite提供的是一些C函数接口,你可以用这些函数操作数据库。通过使用这些接口,传递一些标准 sql 语句(以 char * 类型)给 sqlite 函数,sqlite 就会为你操作数据库。sqlite 跟MS的access一样是文件型数据库,就是说,一个数据库就是一个文件,此数据库里可以建立很多的表,可以建立索引、触发器等等,但是,它实际上得到的就是一个文件。备份这个文件就备份了整个数据库。,(1) 基本流程,sqlite 里最常用到的是 sqlite3 * 类型。从数据库打开开始,sqlit

2、e就要为这个类型准备好内存,直到数据库关闭,整个过程都需要用到这个类型。当数据库打开时开始,这个类型的变量就代表了你要操作的数据库。下面再详细介绍。,打开数据库,int sqlite3_open( 文件名, sqlite3 * );用这个函数开始数据库操作。需要传入两个参数,一是数据库文件名,比如:c:DongChunGuang_Database.db。文件名不需要一定存在,如果此文件不存在,sqlite 会自动建立它。如果它存在,就尝试把它当数据库文件来打开。sqlite3 * 参数即前面提到的关键数据结构。函数返回值表示操作是否正确,如果是 SQLITE_OK 则表示操作正常。下面介绍关闭

3、数据库后,再给一段参考代码。,关闭数据库,int sqlite3_close(sqlite3 *);前面如果用 sqlite3_open 开启了一个数据库,结尾时不要忘了用这个函数关闭数据库。 下面给段简单的代码:,事例:,extern “C“#include “./sqlite3.h“;int main( int , char* )sqlite3 * db = NULL; /声明sqlite关键结构指针int result;/打开数据库/需要传入 db 这个指针的指针,因为 sqlite3_open 函数要为这个指针分配内存,还要让db指针指向这个内存区result = sqlite3_op

4、en( “c:Dcg_database.db”, ,示例,/数据库操作代码/数据库打开成功/关闭数据库sqlite3_close( db );return 0;这就是一次数据库操作过程。,(2) SQL语句操作,i.1 执行sql语句int sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *, char *errmsg );这就是执行一条 sql 语句的函数。第1个参数是前面open函数得到的指针。第2个参数const char *sql 是一条 sql 语句,以结尾。第3个参数sqlite3_callback 是回

5、调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。第4个参数void * 是你所提供的指针,可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。第5个参数char * errmsg 是错误信息。注意是指针的指针。sqlite3里面有很多固定的错误信息。执行 sqlite3_exec 之后,执行失败时可以查阅这个指针(直接 printf(“%s ”,errmsg)得到一串字符串信息,这串信息告诉你错在什么地方。sqlite3_exec函数通过修改你传入的指针的指针,把你提供的指针指向错误提示信息,这样sqlite3_exec

6、函数外面就可以通过这个 char*得到具体错误提示。说明:通常,sqlite3_callback 和它后面的 void * 这两个位置都可以填 NULL。填NULL表示你不需要回调。比如你做 insert 操作,做 delete 操作,就没有必要使用回调。而当你做 select 时,就要使用回调,因为 sqlite3,exec 的回调,typedef int (*sqlite3_callback)(void*,int,char*, char*);下面给个简单的例子:/sqlite3的回调函数/ sqlite 每查到一条记录,就调用一次这个回调int LoadMyInfo( void * par

7、a, int n_column, char * column_value, char * column_name )/para是你在 sqlite3_exec 里传入的 void * 参数/通过para参数,你可以传入一些特殊的指针(比如类指针、结构指针),然后在这里面强制转换成对应的类型(这里面是void*类型,必须强制转换成你的类型才可用)。然后操作这些数据/n_column是这一条记录有多少个字段 (即这条记录有多少列)/ char * column_value 是个关键值,查出来的数据都保存在这里,它实际上是个1维数组(不要以为是2维数组),每一个元素都是一个 char * 值,是一个

8、字段内容(用字符串来表示,以结尾)/char * column_name 跟 column_value是对应的,表示这个字段的字段名称/这里,我不使用 para 参数。忽略它的存在.,示例,int i;printf( “记录包含 %d 个字段 ”, n_column );for( i = 0 ; i 字段值:%s ”, column_namei, column_valuei );printf( “- “ );return 0;,示例,int main( int , char * )sqlite3 * db;int result;char * errmsg = NULL;result = sql

9、ite3_open( “c:Dcg_database.db”, ,示例,/插入一些记录result = sqlite3_exec( db, “insert into MyTable_1( name ) values ( 走路 )”, 0, 0, errmsg );if(result != SQLITE_OK )printf( “插入记录失败,错误码:%d,错误原因:%s ”, result, errmsg );/开始查询数据库result = sqlite3_exec( db, “select * from MyTable_1”, LoadMyInfo, NULL, errmsg );/关闭数

10、据库sqlite3_close( db );return 0;通过上面的例子,应该可以知道如何打开一个数据库,如何做数据库基本操作。,不使用回调查询数据库,上面介绍的 sqlite3_exec 是使用回调来执行 select 操作。还有一个方法可以直接查询而不需要回调。但是,我个人感觉还是回调好,因为代码可以更加整齐,只不过用回调很麻烦,你得声明一个函数,如果这个函数是类成员函数,你还不得不把它声明成 static 的(要问为什么? C+成员函数实际上隐藏了一个参数:this,C+调用类的成员函数的时候,隐含把类指针当成函数的第一个参数传递进去。结果,这造成跟前面说的 sqlite 回调函数的

11、参数不相符。只有当把成员函数声明成 static 时,它才没有多余的隐含的this参数)。虽然回调显得代码整齐,但有时候你还是想要非回调的 select 查询。这可以通过 sqlite3_get_table 函数做到。int sqlite3_get_table(sqlite3*, const char *sql, char *resultp, int *nrow, int *ncolumn, char *errmsg );第1个参数不再多说,看前面的例子。第2个参数是 sql 语句,跟 sqlite3_exec 里的 sql 是一样的。是一个很普通的以结尾的char *字符串。第3个参数是查询

12、结果,它依然一维数组(不要以为是二维数组,更不要以为是三维数组)。它内存布局是:第一行是字段名称,后面是紧接着是每个字段的值。第4个参数是查询出多少条记录(即查出多少行)。第5个参数是多少个字段(多少列)。第6个参数是错误信息,跟前面一样。,示例,int main( int , char * )sqlite3 * db;int result;char * errmsg = NULL;char *dbResult; /是 char * 类型,两个*号int nRow, nColumn;int i , j;int index;result = sqlite3_open( “c:Dcg_databa

13、se.db”, ,示例,if( SQLITE_OK = result )/查询成功index = nColumn; /前面说过 dbResult 前面第一行数据是字段名称,从 nColumn 索引开始才是真正的数据printf( “查到%d条记录 ”, nRow );for( i = 0; i 字段值:%s ”, dbResultj, dbResult index );+index; / dbResult 的字段值是连续的,从第0索引到第 nColumn - 1索引都是字段名称,从第 nColumn 索引开始,后面都是字段值,它把一个二维的表(传统的行列表示法)用一个扁平的形式来表示print

14、f( “- ” );/到这里,不论数据库查询是否成功,都释放 char* 查询结果,使用 sqlite 提供的功能来释放,示例,sqlite3_free_table( dbResult );/关闭数据库sqlite3_close( db );return 0;到这个例子为止,sqlite3 的常用用法都介绍完了。,(4) 事务处理,sqlite 是支持事务处理的。通常一次 sqlite3_exec 就是一次事务,如果你要删除1万条数据,sqlite就做了1万次:开始新事务-删除一条数据-提交事务-开始新事务 - 的过程。这个操作是很慢的。因为时间都花在了开始事务、提交事务上。可以把这些同类操作

15、做成一个事务,这样如果操作错误,还能够回滚事务。事务的操作没有特别的接口函数,它就是一个普通的 sql 语句而已:分别如下:int result;result = sqlite3_exec( db, “begin transaction“, 0, 0, /回滚事务,项目代码,int create_sqlite() sqlite3 *environment_db = NULL;sqlite3 *product_db = NULL;char *errmsg = NULL;char sql256;int ret;char *dbresult;int nrow;int ncolumn;int inde

16、x ; #ifdef DEBUGint i ,j; #endifret = sqlite3_open(“/www/cgi-bin/product.db“,项目代码,memset(sql,0,256);sprintf(sql,“%s“,“create table Product_table(logistics_id varchar(4),id varchar(36),goods_name varchar(30),category varchar(30),inventory varchar(4),produce_place varchar(10)“);ret = sqlite3_exec(prod

17、uct_db, sql, NULL, NULL, ,项目代码,if(ret != SQLITE_OK) perror(“fail to exec2:“);if(ret = SQLITE_ERROR)env_flag = 1;memset(sql,0,256);sprintf(sql,“select logistics_id from Env_table“);ret = sqlite3_get_table(environment_db,sql, #endif,项目代码,memset(sql,0,sizeof(sql);sprintf(sql,“create table temp_abnormal

18、(temp varchar(10),time varchar(35)“);ret = sqlite3_exec(environment_db,sql,NULL,NULL,出入库信息表,int RFID_data(struct M0_dat M_data) char inventory = 1;char out_num = 1;sqlite3 *db = NULL;char *errmsg = NULL;char sql256;int ret;int count; char *dbresult;int nrow;int ncolumn;int index;char *time;char *goo

19、ds_name4 = “鐔婄尗鐢佃“,“璇哄熀浜氭墜鏈?,“鑻规灉“,“鑰楀瓙鑽?,;char *category4 = “瀹剁數“,“IT 鐢靛瓙“,“椋熷搧“,“鍖昏嵂“,;char *produce_place4=“涓婃捣“,“鍖椾含“,“鍝堝皵婊?,“娣卞湷“;static int logistics_id = 0;,项目代码,#ifdef DEBUGint i ,j; #endifret = sqlite3_open(“/www/cgi-bin/product.db“,项目代码,#ifdef DEBU/ printf(“nrow %d ncolumn %dn“,nrow,ncolum

20、n);index = ncolumn;for(i = 0;i nrow;i +)for(j = 0;j ncolumn; j+)printf(“name %s value %sn“,dbresulti,(dbresultindex);+ index;printf(“*n“); #endif/ printf(“ssddddddddddssssssn“);if(count = 0 ,项目代码,else count = 1;memset(sql,0,256);sprintf(sql,“insert into Product_table(logistics_id,id,goods_name,categ

21、ory,inventory,produce_place) values(%d,%s,%s,%s,%d,%s)“,logistics_id,M_data.rfid,goods_namelogistics_id,categorylogistics_id,count,produce_placelogistics_id);ret = sqlite3_exec(db,sql,NULL,NULL, ,温度信息表,int insert_temp_abnormal(int temp ) sqlite3 *db = NULL;char * errmsg = NULL;char sql256;int ret;ch

22、ar * time = get_time();ret = sqlite3_open(“/www/cgi-bin/environment.db“,项目代码,int insert_hum_abnormal(int hum ) sqlite3 *db = NULL;char * errmsg = NULL;char sql256;int ret;char * time = get_time();ret = sqlite3_open(“/www/cgi-bin/environment.db“,照明信息表,int insert_bright_abnormal(int bright ) sqlite3 *

23、db = NULL;char * errmsg = NULL;char sql256;int ret;char * time = get_time();ret = sqlite3_open(“/www/cgi-bin/environment.db“,外人闯入信息表,int insert_thief_abnormal() sqlite3 *db = NULL;char * errmsg = NULL;char sql256;int ret;char * time = get_time();ret = sqlite3_open(“/www/cgi-bin/environment.db“,环境信息表

24、,int Env_data(struct M0_env_data M0_data) sqlite3 *db = NULL; char *errmsg = NULL; char sql256; int ret; char *time; int static first_no_del = 0;ret = sqlite3_open(“/www/cgi-bin/environment.db“, ,用户表,char * get_phone_by_uid(char uid) sqlite3 *db = NULL;char *errmsg = NULL;char sql256;int ret = 0;char *dbresult;int nrow;int ncolumn;int index;ret = sqlite3_open(“/www/cgi-bin/user.db“, ,谢谢!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 学术论文 > 大学论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报