sqlite3学习笔记-方法介绍和测试代码

创建数据库 :sqlite3 test.db
查看数据数据 : .databases

创建表 :create table student (id integer primary key autoincrement,name txt,age int, birthday txt)
查看表 :.tables
删除表:drop table test.menber

===========================================================================

内连接 - INNER JOIN
内连接(INNER JOIN)根据连接谓词结合两个表(table1 和 table2)的列值来创建一个新的结果表。查询会把 table1 中的每一行与 table2 中的每一行进行比较,找到所有满足连接谓词的行的匹配对。当满足连接谓词时,A 和 B 行的每个匹配对的列值会合并成一个结果行。

SELECT * FROM student as a INNER JOIN company as b ON a.age=b.age;
student.
1    22    che
2    23    jiajiae
3    27    hahah
company:
4    chelin    27    1992-10-15 00:00:00
3    linglin    27    1992-10-15 00:00:00
1    chejia    27    1992-008-12 00:00:00
2    wanglei    32    1988-008-12 00:00:00

结果:
3    27    hahah    1    chejia    27    1992-008-12 00:00:00
3    27    hahah    4    chelin    27    1992-10-15 00:00:00
3    27    hahah    3    linglin    27    1992-10-15 00:00:00======================================================================

接口介绍


1.  sqlite3_open():打开数据库在操作数据库之前,首先要打开数据库。
这个函数打开一个sqlite数据库文件的连接并且返回一个数据库连接对象。
这个操作同时程序中的第一个调用 的sqlite函数,同时也是其他sqlite api的先决条件。
许多的sqlite接口函数都需要一个数据库连接对象的指针作为它们的第一个参数。
函数定义

int sqlite3_open(const char *filename,     /* Database filename (UTF-8) */sqlite3 
                 **ppDb                    /* OUT: SQLite db handle */);
int sqlite3_open16(const void *filename,   /* Database filename (UTF-16) */sqlite3 
                           **ppDb          /* OUT: SQLite db handle */);
int sqlite3_open_v2(const char *filename,  /* Database filename (UTF-8) */sqlite3 
                             **ppDb,       /* OUT: SQLite db handle */
                      int flags,              /* Flags */
                    const char *zVfs       /* Name of VFS module to use */);


说明:假如这个要被打开的数据文件不存在,则一个同名的数据库文件将被创建。
如果使用sqlite3_open和sqlite3_open_v2的话,数据库将采用UTF-8的编码方式,sqlite3_open16采用UTF-16的编码方式返回值:如果sqlite数据库被成功打开(或创建),将会返回SQLITE_OK,否则将会返回错误码。
Sqlite3_errmsg()或者sqlite3_errmsg16可以用于获得数据库打开错误码的英文描述,
这两个函数定义为:

const char *sqlite3_errmsg(sqlite3*);const void *sqlite3_errmsg16(sqlite3*);


无论是否成功打开数据库, 都应该使用 sqlite3_close() 关闭数据库连接.
参数说明:filename:需要被打开的数据库文件的文件名,在sqlite3_open和sqlite3_open_v2中这个参数采用UTF-8编码
而在sqlite3_open16中则采用UTF-16编码ppDb:一个数据库连接句柄被返回到这个参数,即使发生错误。
唯一的一场是如果sqlite不能分配内存来存放sqlite对象,ppDb将会被返回一个NULL值。
flags:作为数据库连接的额外控制的参数,可以是SQLITE_OPEN_READONLY,SQLITE_OPEN_READWRITE和 SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE中的一个,用于控制数据库的打开方式,可以和SQLITE_OPEN_NOMUTEX,SQLITE_OPEN_FULLMUTEX,SQLITE_OPEN_SHAREDCACHE,以及SQLITE_OPEN_PRIVATECACHE结合使用,

======================================================================
sqlite3_prepare这个函数将sql文本转换成一个准备语句(prepared statement)对象,同时返回这个对象的指针。
这个接口需要一个数据库连接指针以及一个要准备的包含SQL语句的文本。
它实际上并不执行(evaluate)这个SQL语句,它仅仅为执行准备这个sql语句

int sqlite3_prepare(sqlite3*, const char*, int, sqlite3_stmt**, const char**);
int sqlite3_prepare16(sqlite3*, const void*, int, sqlite3_stmt**, const void**);
int sqlite3_finalize(sqlite3_stmt*);
int sqlite3_reset(sqlite3_stmt*);


sqlite3_prepare 接口把一条SQL语句编译成字节码留给后面的执行函数.
sqlite3_finalize() 将销毁一个准备好的SQL声明. 在数据库关闭之前,所有准备好的声明都必须被释放销毁. 
sqlite3_reset() 函数用来重置一个SQL声明的状态,使得它可以被再次执行.
======================================================================

int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
int sqlite3_bind_double(sqlite3_stmt*, int, double);
int sqlite3_bind_int(sqlite3_stmt*, int, int);
int sqlite3_bind_int64(sqlite3_stmt*, int, long long int);
int sqlite3_bind_null(sqlite3_stmt*, int);
int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));
int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); 


第一个参数始终是指向sqlite3_prepare_v2()或其变体返回的sqlite3_stmt对象 的指针。
第二个参数是要设置的SQL参数的索引 起始索引是1;
第三个参数是绑定到参数的值
第四个参数的那些例程中,其值是参数中的字节数
第五个参数是一个析构函数,第三个参数是NULL指针或第四个参数为负,则不会调用析构函数。五个参数是特殊值      SQLITE_STATIC,那么SQLite假定信息在静态的非托管空间中,并且不需要释放。如果第五个参数的值为SQLITE_TRANSIENT,则SQLite会在sqlite3_bind _ *()例程返回之前立即创建自己的数据私有副本。
第六个参数必须是 SQLITE_UTF8,SQLITE_UTF16,SQLITE_UTF16BE或SQLITE_UTF16LE之一, 以指定第三个参数中文本的编码。
============================================================

int sqlite3_step(sqlite3_stmt*);


如果SQL返回了一个单行结果集,sqlite3_step() 函数将返回 SQLITE_ROW , 如果SQL语句执行成功或者正常将返回 SQLITE_DONE , 否则将返回错误代码. 如果不能打开数据库文件则会返回 SQLITE_BUSY
============================================================

获得记录集行中的数据:

const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
int sqlite3_column_count(sqlite3_stmt*);
const char *sqlite3_column_decltype(sqlite3_stmt *, int iCol);
const void *sqlite3_column_decltype16(sqlite3_stmt *, int iCol);
double sqlite3_column_double(sqlite3_stmt*, int iCol);
int sqlite3_column_int(sqlite3_stmt*, int iCol);
long long int sqlite3_column_int64(sqlite3_stmt*, int iCol);
const char *sqlite3_column_name(sqlite3_stmt*, int iCol);
const void *sqlite3_column_name16(sqlite3_stmt*, int iCol);
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
int sqlite3_column_type(sqlite3_stmt*, int iCol);

sqlite3_column_count()函数返回结果集中包含的列数. sqlite3_column_count() 可以在执行了 sqlite3_prepare()之后的任何时刻调用. sqlite3_data_count()除了必需要在sqlite3_step()之后调用之外,其他跟sqlite3_column_count()大同小异. 
如果调用sqlite3_step()返回值是 SQLITE_DONE 或者一个错误代码, 则此时调用sqlite3_data_count()将返回 0 ,
然而 sqlite3_column_count() 仍然会返回结果集中包含的列数.

返回的记录集通过使用其它的几个 sqlite3_column_***() 函数来提取, 所有的这些函数都把列的编号作为第二个参数. 列编号从左到右以零起始. 请注意它和之前那些从1起始的参数的不同.

sqlite3_column_type()函数返回第N列的值的数据类型. 具体的返回值如下:
#define SQLITE_INTEGER  1
#define SQLITE_FLOAT    2
#define SQLITE_TEXT     3
#define SQLITE_BLOB     4
#define SQLITE_NULL     5
sqlite3_column_decltype() 则用来返回该列在 CREATE TABLE 语句中声明的类型. 
它可以用在当返回类型是空字符串的时候. 
sqlite3_column_name() 返回第N列的字段名.
sqlite3_column_bytes() 用来返回 UTF-8 编码的BLOBs列的字节数或者TEXT字符串的字节数. 
sqlite3_column_bytes16() 对于BLOBs列返回同样的结果,但是对于TEXT字符串则按 UTF-16 的编码来计算字节数. 
sqlite3_column_blob() 返回 BLOB 数据. (二进制数据)
sqlite3_column_text() 返回 UTF-8 编码的 TEXT 数据. 
sqlite3_column_text16() 返回 UTF-16 编码的 TEXT 数据. 
sqlite3_column_int() 以本地主机的整数格式返回一个整数值. 
sqlite3_column_int64() 返回一个64位的整数. 
sqlite3_column_double() 返回浮点数.

========================================================================================

int sqlite3_close(sqlite3*);

这个过程关闭前面使用sqlite3_open打开的数据库连接,任何与这个连接相关的准备语句必须在调用这个关闭函数之前被释放

=====================================
intsqlite3_errcode(sqlite3* pDB    /* SQLite3 数据库句柄 */);说明:该函数返回最近一次调用 sqlite3_ API时产生的错误码.

const char *sqlite3_errmsg(sqlite3* pDB    /* SQLite3 数据库句柄 */);说明:该函数返回与pDB数据库指针相关的错误信息

测试代码:

#include<iostream>
#include"../sqlite3/sqlite3.h"
using namespace std;


// 根据文件路径打开数据库连接。如果数据库不存在,则创建。
// 数据库文件的路径必须以C字符串传入。
sqlite3 *sql = nullptr; // 一个打开的数据库实例

void insert_data()
{
	char buf[128];
	for (int i = 35000; i < 35010; i++)
	{
		memset(buf, 0, 128);
		sprintf_s(buf, 128, "INSERT INTO test(id, name) VALUES(%d,'%05d'); ", i, i);
	
		//char *sqlSentence = buf;        //SQL
		char *sqlSentence = "INSERT INTO test(id, name) VALUES(?,:aaa); ";        //SQL语句
		sqlite3_stmt *stmt = nullptr;        //stmt语句句柄



		//进行插入前的准备工作——检查语句合法性
		//-1代表系统会自动计算SQL语句的长度
		int result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL);
		//sqlite3_bind_blob(stmt,)
		sqlite3_bind_int(stmt, 1, i);
		sqlite3_bind_text(stmt, 2, "chejia", -1, nullptr);
		result = sqlite3_step(stmt);// == SQLITE_DONE;
		if (result == SQLITE_DONE) {
			//std::clog << "添加数据语句OK" << endl;
			//执行该语句
			
		}
		else {
			std::clog << "添加数据语句有问题" << endl;
		}
		//清理语句句柄,准备执行下一个语句
		sqlite3_finalize(stmt);
	}
}

void selcet_test()
{
	

	const char *sqlSentence = "SELECT * from test; ";    //SQL语句
	sqlite3_stmt *stmt = NULL;    // stmt语句句柄

	//进行查询前的准备工作——检查语句合法性
	//-1代表系统会自动计算SQL语句的长度
	int result = sqlite3_prepare_v2(sql, sqlSentence, -1, &stmt, NULL);

	if (result == SQLITE_OK) {
		std::clog << "查询语句OK";
		// 每调一次sqlite3_step()函数,stmt语句句柄就会指向下一条记录
		while (sqlite3_step(stmt) == SQLITE_ROW) {
			// 取出第0列字段的值
			 int id = sqlite3_column_int(stmt, 0);
			// 取出第1列字段的值
			 const unsigned char *name = sqlite3_column_text(stmt, 1);
			//输出相关查询的数据
			 std::clog << "id = " << id << ", name = " << name << endl;
		}
	}
	else {
		std::clog << "查询语句有问题<<endl";
	}
	//清理语句句柄,准备执行下一个语句
	sqlite3_finalize(stmt);
}
int main()
{
	
	const char * path = "C:\\Users\\admin\\test.db";//某个sql文件的路径
	int result = sqlite3_open_v2(path, &sql, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_SHAREDCACHE, NULL);

	if (result == SQLITE_OK) {
		std::clog << "打开数据库连接成功" << endl;
	}
	else {
		std::clog << "打开数据库连接失败"<<endl;
	}
	insert_data();
	//selcet_test();
	sqlite3_close(sql);

}
发布了136 篇原创文章 · 获赞 22 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/u010261063/article/details/90346189
今日推荐