图1:SQLite数据库操作基本步骤
3、一次完成的SQLite数据库操作包括1、打开(没有为自动新建)数据库;--->2、编译SQL语句。由于SQLite不能直接执行SQL指令,需要将SQL指令编译成字节码。3、执行操作4、获取执行结果;5、销毁SQL指令字节码;6、关闭数据库。
2.2 新建(或者打开已有)数据库A、打开(新建)数据库
打开数据库用到的是sqlite3_open()。函数原型如下:
int sqlite3_open(
const char *filename, /* Databasefilename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite dbhandle */
);
用这个函数开始数据库操作。
需要传入的参数是数据库文件的完整路径,比如:c:Test_Database.db。
² 注:文件名不需要一定存在,如果此文件不存在,SQLite会自动建立它。如果它存在,就尝试把它当数据库文件来打开。
sqlite3 ** 返回的是数据库的操作句柄(引用),是一个32位有符号整型数据。
函数返回值表示操作是否正确,如果返回SQLITE_OK(0)则表示操作正常。
图2:LabVIEW中打开数据库节点
2.3 执行SQL语句在SQLite中提供一些已封装的函数供直接执行SQL语句,如sqlite3_exec()、sqlite3_get_table()。这里我们主要介绍SQLite的SQL执行过程,对于SQLite中已封装的函数请参考相关说明,这里不再阐述。
通过图1所示,我们可以看到SQLite执行一条SQL语句需要三个步骤,与之相关的函数包括:sqlite3_prepare(),sqlite3_step(),sqlite3_finalize。下面我们详细看一下这几个函数的作用和用法。
2.3.1. SQL语句声明(编译)SQLite中并不能直接识别SQL语句,在执行SQL操作前需要先将SQL语句编译成SQLite可识别的二进制字节码,SQLite提供了sqlite3_prepare()函数来执行SQL语句的编译。
sqlite3_prepare()函数原型为:
int sqlite3_prepare(
sqlite3 *db, /* Database handle */
const char *zSql, /* SQL statement, UTF-8 encoded */
int nByte, /* Maximum length of zSql inbytes. */
sqlite3_stmt **ppStmt, /* OUT: Statement handle */
const char **pzTail /* OUT: Pointer to unused portion of zSql*/
);
函数返回的stmt就是已编译的二进制字节码,提供给后续的操作函数。
图3:LabVIEW中编译SQL语句节点
² sqlite3_prepare 接口把一条SQL语句编译成字节码留给后面的执行函数。 使用该接口访问数据库是当前比较好的的一种方法。注:输入的参数中只有第一个SQL语句会被编译
2.3.2. 执行SQL语句在SQL声明准备好之后, 需要调用sqlite3_step()来执行:
sqlite3_step()函数原型
int sqlite3_step(sqlite3_stmt*);
图4:LabVIEW中执行SQL语句节点
在这里需要注意的是成功执行完sqlite3_step()后并不会返回SQLITE_OK(0)。在执行INSERT、UPDATE、CREATE TABLE、DROP TABLE、DELETE等数据库操作时,如果SQL语句执行成功或者正常sqlite3_step() 函数将返回 SQLITE_DONE(101),否则将返回错误代码。在执行SELETE操作时,如果SQL返回了查询结果,sqlite3_step() 函数将返回 SQLITE_ROW(100)。
² 注:如果SQL语言是SELETE操作,每执行一次sqlite3_step() 函数,只能返回一条查询结果,如果要获取多条查询结果,则需要多次执行sqlite3_step() 函数。
如果函数的返回值是 SQLITE_ROW(100), 那么下边的这些方法可以用来获得记录集行中的数据:
Ø sqlite3_column_count()函数返回结果集中包含的列数。
Ø sqlite3_column_decltype() 则用来返回该列在 CREATE TABLE 语句中声明的类型。
Ø sqlite3_column_name() 返回第N列的字段名。
Ø sqlite3_column_bytes() 用来返回 UTF-8 编码的BLOBs列的字节数或者TEXT字符串的字节数。
Ø sqlite3_column_text() 返回 UTF-8 编码的 TEXT 数据。
² 不一定非要按照sqlite3_column_type()接口返回的数据类型来获取数据. 数据类型不同时软件将自动转换.
2.3.3 结束SQL语句在数据库关闭之前,所有准备好的声明都必须被释放销毁。在执行了sqlite3_prepare()函数之后,任何时候都可以通过调用 sqlite3_finalize() 将一个准备好的SQL声明销毁。
sqlite3_finalize()函数原型:
int sqlite3_finalize(sqlite3_stmt*);
图5:LabVIEW中结束SQL语句节点
2.4 关闭数据库 用sqlite3_close()关闭已打开的数据库,释放资源。
sqlite3_close()函数原型:
int sqlite3_close(sqlite3 *);
图6:LabVIEW中关闭SQLite数据库节点
3.在LabVIEW中完成一次数据库完成操作实例
图7:LabVIEW中创建数据表实例