SQLite的教程(二):对C/C++接口简介
1。总结:在C / C++接口提供的SQLite,其中5属于核心接口。在这篇博客中,我们将主要介绍它们的用法和所涉及的核心数据库对象,如database_connection和prepared_statement.compared的API提供的其他数据库引擎,如OCI,MySQL的API,所以,提供的SQLite的接口仍然是理解和掌握很容易。
两。核心对象和接口:
1。核心对象:
在SQLite中最重要的两个对象,database_connection和prepared_statement.the database_connection对象(由sqlite3_open)接口函数创建并返回,在使用应用程序中的任何其他数据库的接口函数,你必须首先调用该函数以获得database_connnection对象,其他后续的调用API,需要完成的工作对象作为输入参数。在prepare_statement,我们可以简单地把它看成一个编译的SQL语句。因此,与SQL语句执行相关的所有函数也需要对象作为输入参数来完成指定的SQL操作。
2。核心接口:
1)。sqlite3_open
该功能已经提到的,这是操作sqlite数据库的入口函数,这个函数返回database_connection对象是一个句柄参数很多SQLite API。注意,我们可以打开现有的数据库文件或通过此功能创建新的数据库文件。为database_connection对象函数返回的,我们可以共享多线程之间的对象的指针来完成任何有关数据库的操作。但是,在多线程的情况下,更推荐使用方式是创建每个线程独立的database_connection对象。这个功能,我们需要额外的说明。我们不需要创建访问多个数据库中的多个数据库连接对象,因为附加的命令可以对SQLite可以轻松地访问一个连接多个数据库。
2)。sqlite3_prepare
这个函数将SQL文本到prepared_statement对象并返回后执行的函数是对象的指针,这个函数不评价参数指定的SQL语句,它初始化SQL文本,是要执行的状态。最后,需要指出的是,我们可以使用sqlite3_prepare_v2接口函数的替代函数为新的应用程序相同的工作。
3)。sqlite3_step
这个函数是用来评价prepared_statement sqlite3_prepare函数返回的对象。执行该功能后,prepared_statement对象的内部指针将指向返回的结果集的第一行。如果你想进一步进行后续的数据线,你需要调用函数,直到所有数据行走过。然而,对于DML语句,如插入、更新和删除的功能,可以执行一次。
4)。sqlite3_column
此函数用于获取当前行中指定行的数据。然而,在严格意义上,这个函数不在SQLite的接口函数的存在,而是由一组相关的接口函数完成,其中每个函数返回不同类型的数据,如:
复制代码代码如下所示:
sqlite3_column_blob
sqlite3_column_bytes
sqlite3_column_bytes16
sqlite3_column_double
sqlite3_column_int
sqlite3_column_int64
sqlite3_column_text
sqlite3_column_text16
sqlite3_column_type
sqlite3_column_value
sqlite3_column_count
的sqlite3_column_count函数用于获取当前结果集的字段数据。以下是sqlite3_step和sqlite3_column函数迭代结果中每一行数据的伪代码的使用。注意,这里有一个简化字段类型判断的示例代码。
复制代码代码如下所示:
int需要比较的字段为sqlite3_column_count(…);
而(sqlite3_step(…)> EOF){
为(int i = 0;i < fieldcount;+ +我){
int v = sqlite3_column_int(…,我);
}
}
5)。sqlite3_finalize
此函数用于销毁已准备好的语句对象,否则将导致内存泄漏。
6)。sqlite3_close
这个函数用于关闭先前打开database_connection对象,和所有prepared_statements对象,对象必须被摧毁之前,相关。
三。参数绑定:
像大多数关系数据库,SQLite的SQL文本还支持变量绑定,以减少SQL语句动态解析的数量,从而提高数据查询和数据操作。要完成此操作,我们需要使用其他两个接口,API,sqlite3_reset,和sqlite3_bind看到提供的SQLite。下面的例子:
复制代码代码如下所示:
无效test_parameter_binding(){
//1. 不带参数绑定插入多个数据。
焦StrSQL { 128 };
为(int i = 0;i < max_rows;+ +我){
sprintf(StrSQL,插入数据值(%)
sqlite3_prepare_v2(…,如何);
sqlite3_step(prepared_stmt);
sqlite3_finalize(prepared_stmt);
}
在 2中插入了多个数据。参数绑定。
字符串strsqlwithparameter =插入值(数据);
sqlite3_prepare_v2(…,如何);
为(int i = 0;i < max_rows;+ +我){
sqlite3_bind(…,我);
sqlite3_step(prepared_stmt);
sqlite3_reset(prepared_stmt);
}
sqlite3_finalize(prepared_stmt);
}
解释的第一件事是,问号在SQL语句中的插入数据值()代表参数的变量的占位符,这是许多关系数据库的一致性,所以这是方便的数据库迁移。
通过上面的示例代码,可以清楚地看到,参数绑定的执行效率远远高于每次生成不同SQL语句的效率,即2,效率远远超过1。比较了以下两种具体方法。
1)。从程序的表面,前者完成更多的任务在for循环中,如字符串填充,编写SQL语句,和prepared_statement对象的释放。
2)。它明确指出,sqlite3_prepare_v2 SQLite的效率往往低于sqlite3_step效率的官方文件。
3)。当插入的数据量很大时,后者的效率仍然相当高。