当前位置:文档之家› C C++中使用SQLite_3 数据库

C C++中使用SQLite_3 数据库

在C/C++中使用SQLite廖卫东C/C++接口SQLite3.0依据以下需求而创建:支持UTF-16。

用户可定义的文本排序。

以索引列的形式存储BLOB。

SQLite3.0的API包括了83个独立的函数。

简单的程序可以通过三个函数工作:sqlite3_open()、sqlite3_exec()和sqlite3_close()。

更多的数据库引擎运行控制可以用sqlite3_prepare()来编译一个SQLite语句成字节代码并通过sqlite3_step()来执行它。

一个用sqlite3_column_开头的命令序列可以用来提取关于查询结果的信息。

许多接口函数是以UTF-8和UTF-16的形式成对出现的。

并且有一个用于实现用户定义SQL函数和用户定义的text比较。

打开与关闭一个数据库typedef struct sqlite3 sqlite3;int sqlite3_open(const char*, sqlite3**);int sqlite3_open16(const void*, sqlite3**);int sqlite3_close(sqlite3*);sqlite3_open()程序返回一个整型错误代码,而不是像sqlite2做的那样返回一个指向sqlite3结构。

sqlite3_open()与sqlite3_open16()间的区别是sqlite3_open16()采用UTF-16(以本地字节顺序)作为数据库文件名。

如果一个新数据库文件需要被创建,那么sqlite3_open16()设置本地的文本表达式为UTF-16而sqlite3_open()设置文本表达式为UTF-8。

const char *sqlite3_errmsg(sqlite3*);const void *sqlite3_errmsg16(sqlite3*);int sqlite3_errcode(sqlite3*);sqlite3_errcode()指令返回一个最近的主API调用的结果代码。

sqlite3_errmsg()返回一个最近错误的英文信息。

错误码信息可能是暂时的-它可能在接下来的任何SQLite函数调用时消失。

sqlite3_errmsg16()象sqlite3_errsmg()一样工作,除了它以本地字节顺序返回一个UTF-16错误信息。

SQLite 3 的错误代码#define SQLITE_OK 0 /* 成功的结果*/#define SQLITE_ERROR 1 /* SQL 错误或没有数据库*/#define SQLITE_INTERNAL 2 /* 一个SQLite内部的逻辑错误*/#define SQLITE_PERM 3 /* 存取许可被拒绝*/#define SQLITE_ABORT 4 /* 需要一个中断的Callback指令*/#define SQLITE_BUSY 5 /* 数据据库文件被锁定*/#define SQLITE_LOCKED 6 /* 数据库中的一个表被锁定*/#define SQLITE_NOMEM 7 /* malloc()失败*/#define SQLITE_READONLY 8 /* 试图写一个只读的数据库*/#define SQLITE_INTERRUPT 9 /* 操作被sqlite_interrupt()结束*/#define SQLITE_IOERR 10 /* 某种磁盘I/O错误发生*/#define SQLITE_CORRUPT 11 /* 数据库磁盘镜像异常*/#define SQLITE_NOTFOUND 12 /* (Internal Only) 表或记录不存在*/#define SQLITE_FULL 13 /* 数据库满插入失败*/#define SQLITE_CANTOPEN 14 /* 不能打开数据库文件*/#define SQLITE_PROTOCOL 15 /* 数据库错定协议错*/#define SQLITE_EMPTY 16 /* (Internal Only)数据库表为空*/ #define SQLITE_SCHEMA 17 /* 数据库结构被改变*/#define SQLITE_TOOBIG 18 /* 一个表的行数据过多*/#define SQLITE_CONSTRAINT 19 /* 由于约束冲突而中止*/#define SQLITE_MISMATCH 20 /* 数据类型不匹配*/#define SQLITE_MISUSE 21 /* 库被不正确使用*/#define SQLITE_NOLFS 22 /* 主机不支持的OS特性*/#define SQLITE_AUTH 23 /* 授权被否定*/#define SQLITE_ROW 100 /* sqlite_step()有另一行就绪*/ #define SQLITE_DONE 101 /* sqlite_step()已经完成执行*/执行SQL语句typedef int(*sqlite_callback)(void*,int,char**, char**);int sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void*, char**);第一个参数是一个打开的数据库在第二个参数中给出的0或多个SQL语句被编译执行。

查询结果被返回给Callback函数。

在SQLite3中,sqlite3_exec()函数像包含一个预定义语句接口的调用的容器。

第三个参数是回调函数,不使用回调函数,该参数为0第四个参数是回调函数的参数,如果没有参数,为0第五个参数是返回的错误信息这个函数的功能是执行一条或者多条SQL 语句,SQL 语句之间用“;”号隔开。

建议在执行一条或者多条SQL 语句得时候,指定第三个参数回调函数,在回调函数中可以获得执行Sql 得详细过程,如果所有Sql 执行完毕则应该返回0 ,否则,则说明这次执行并没有完全成功。

第五个参数:如果执行失败(没有返回0 )则可以查看第五个阐述得值。

来查看详细错误信息。

用C/C++语言操作数据库创建数据库:使用open打开一个数据库,如果不存在,则创建该数据库sqlite3 *db = NULL;char *zErrMsg= 0; //保存错误信息int rc;//打开指定的数据库,如果不存在,将创建一个同名的数据库rc= sqlite3_open(“DataBaseName.db", &db);if(rc){fprintf(stderr, "Can't open database:%s\n", sqlite3_errmsg(db));exit(1);}else{printf("open DataBaseName successfully!\n");}编译上述代码:出现如下错误[root@localhost sqltest]# gcc test1.c -o test1test1.c:2:21: sqlite3.h: 没有那个文件或目录test1.c: In function `main':test1.c:5: error: `sqlite3' undeclared (first use in this function)test1.c:5: error: (Each undeclared identifier is reported only oncetest1.c:5: error: for each function it appears in.)test1.c:5: error: `db' undeclared (first use in this function) [root@localhost sqltest]#应使用如下编译方式:[root@localhost sqltest]# gcc test1.c -o test1 -lsqlite3-L/usr/local/sqlite-3.3.7/lib -I/usr/local/sqlite-3.3.7/include-lsqlite3:由于用到了用户自己的库文件,所用应该指明所用到的库libsqlite3.so.0.8.6 等-L/usr/local/sqlite-3.3.7/lib:qlite的库文件生成在/usr/local/sqlite-3.3.7/lib 目录下,所以应该指明库文件的路径-I/usr/local/sqlite-3.3.7/include:指定头文件sqlite3.h 的路径(注意这里是是大写的i)重新编译,出现如下错误:[root@localhost sqltest]# gcc test1.c -o test1 -lsqlite3 -L/usr/local/sqlite-3.3.7/lib -l/usr/local/sqlite-3.3.7/include test1.c:2:21: sqlite3.h: 没有那个文件或目录test1.c: In function `main':test1.c:5: error: `sqlite3' undeclared (first use in this function)test1.c:5: error: (Each undeclared identifier is reported only oncetest1.c:5: error: for each function it appears in.)test1.c:5: error: `db' undeclared (first use in this function)[root@localhost sqltest]# exportLD_LIBRARY_PATH=/usr/local/sqlite-3.3.7/lib:$ LD_LIBRARY_PATH[root@localhost sqltest]# gcc test1.c -o test1 -lsqlite3 -L/usr/local/sqlite-3 .3.7/lib -I/usr/local/sqlite-3.3.7/include编译成功:[root@localhost sqltest]# ./test1You have opened a sqlite3 database named testdb.db successfully!创建表:使用sqlite3_exec执行SQL命令创建表char *zErrMsg= 0; //保存错误信息//创建一个表,如果表存在,则不创建,将错误信息保存在zErrMsg中char *sql= "CREATE TABLE SensorData( \ID INTEGER PRIMARY KEY, \SensorID INTEGER, \SiteNum INTEGER, \Time VARCHAR(12), \SensorParamenter REAL);";sqlite3_exec(db, sql, 0, 0, &zErrMsg);插入数据:sql= "INSERT INTO SensorData VALUES(NULL, 1, 1, '201004111206',18.9);";sqlite3_exec(db, sql, 0, 0, &zErrMsg);sql= "INSERT INTO SensorData VALUES(NULL, 1, 1, '201004111306',16.9);";sqlite3_exec(db, sql, 0, 0, &zErrMsg);编译运行程序,在sqlite3中测试是否插入了数据:[root@localhost sqltest]# sqlite3 testdb.dbSQLite version 3.3.7Enter ".help" for instructionssqlite> select * from SensorData;1|1|1|201004111206|18.92|1|1|201004111306|16.9sqlite>查询: 非回调查询使用sqlite3_get_table获取表中的信息//查询信息sql= "SELECT * FROM SensorData";//azResult是以数组的形式存放的查询结果,首先是表名,再是数据//nrow, ncolumn分别为查询语句返回的结果集的行数和列数,没有查到结果返回0sqlite3_get_table(db, sql, &azResult, &nrow,&ncolumn, &zErrMsg);非回调select 查询:功能:执行一次查询Sql并且返回得到一个记录集。

相关主题