【C语言数据库】Sqlite3基础介绍

本文介绍了SQLite,一个轻量级、高度可靠的SQL数据库引擎,广泛应用于各种设备和应用中。文章详细讲解了SQLite的C语言接口,包括如何打开和关闭数据库,如何执行SQL语句,特别是分步执行SQL的步骤,以及相关C语言示例。
摘要由CSDN通过智能技术生成

1. SQLite简介

SQLite is a C-language library that implements a small, fast, self-contained, high-reliability, full-featured, SQL database engine. SQLite is the most used database engine in the world. SQLite is built into all mobile phones and most computers and comes bundled inside countless other applications that people use every day.

SQLite是一个C语言库,它实现了一个小型、快速、独立、高可靠性、功能齐全的SQL数据库引擎。 SQLite 是世界上使用最广泛的数据库引擎。SQLite内置于所有手机和大多数计算机中,并捆绑在人们每天使用的无数其他应用程序中。

D. Richard Hipp于2000年春设计了SQLite(最初是作为Tcl扩展),设计目的是让程序无需安装数据库管理系统或不需要数据库管理员即可运行。与Client-Server DBMS(客户端-服务器端数据库管理系统)不同,SQLite没有与应用程序通信的独立进程。而是将SQLite库(静态或动态)集成到应用程序中,该应用程序通过调用函数来使用SQLite的功能,从而减少数据库操作的延迟。对于不需要高并发的简单查询,SQLite的性能得益于避免进程间通信的开销。

SQLite将整个数据库(table、index和data)存储为单个文件,允许多个进程或线程同时访问同一数据库(写入时锁定数据库文件)。SQLite读取操作可以是多任务的,但由于无服务器设计,写入只能顺序执行。由于SQLite必须依赖文件系统锁,因此它不是需要密集型写入的部署首选。

2. SQLite的C语言接口

Sqlite3数据库中有表如下:

CREATE TABLE IF NOT EXISTS "COMPANY" (
ID INTEGER PRIMARY KEY,
NAME TEXT NOT NULL,
AGE INTEGER NOT NULL
);

INSERT INTO COMPANY (NAME, AGE) VALUES ("Stone", 25);
INSERT INTO COMPANY (NAME, AGE) VALUES ("White", 18);
INSERT INTO COMPANY (NAME, AGE) VALUES ("Ruby", 27);
ID  NAME   AGE
--  -----  ---
1   Stone  25 
2   White  18 
3   Ruby   27 

2.1 打开关闭数据库

数据库连接对象为 sqlite3

  • sqlite3_open_v2() 生成
  • sqlite3_close_v2() 销毁
int sqlite3_open_v2(		/* Open database */
	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 */
);

参数:

  1. filename 数据库文件名。
  2. **ppDB 即使发生错误,数据库连接句柄通常也会在 *ppDb 中返回。唯一的例外是,如果无法分配内存来保存 sqlite3* 对象,则 NULL 将被写入 *ppDb 而不是指向 sqlite3 对象的指针。
  3. flags 用于设置打开模式的标识,基础标识有:
    • SQLITE_OPEN_READONLY 数据库以只读模式打开。 如果数据库尚不存在,则返回错误。
    • SQLITE_OPEN_READWRITE 如果可能,数据库将打开以进行读写,或者仅在文件受到操作系统写保护时才进行读取。 无论哪种情况,数据库都必须已经存在,否则会返回错误。
    • SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE 打开数据库进行读写,如果数据库不存在则创建该数据库。这是 sqlite3_open()sqlite3_open16() 始终使用的行为。
  4. zVfs sqlite3_vfs 对象的名称,该对象定义新数据库连接应使用的操作系统接口。如果值为 NULL,则使用默认的 sqlite3_vfs 对象。

函数int sqlite3_db_readonly(sqlite3 *db, const char *zDbName) 可以用来判断数据库是否真正可读写。第一个参数是数据库句柄,第二个参数是数据库连接的名字,主连接为 "main"

如果数据库打开(或创建)成功,则返回 SQLITE_OK。否则返回错误代码。

  • int sqlite3_errmsg(sqlite3 *) 用于失败后获取错误的英语描述。
  • const char *sqlite3_errcode(sqlite3 *) 用于失败后获取错误代号。
int sqlite3_close_v2(sqlite3*)	/* Close database, and destruct the sqlite3 object. */;

2.2 执行SQL语句

sqlite3_exec() 函数是sqlite3_prepare_v2()sqlite3_step()sqlite3_finalize() 的便捷包装器,它允许应用程序运行多个 SQL 语句,而无需使用大量C代码。

int sqlite3_exec(
	sqlite3* db,                               /* An open database */
  	const char *sql,                           /* SQL to be evaluated */
  	int (*callback)(void*,int,char**,char**),  /* Callback function */
  	void *,                                    /* 1st argument to callback */
  	char **errmsg                              /* Error msg written here */
);

参数:

  1. sqlite3* db 数据库句柄
  2. const char *sql 要执行的SQL语句。
  3. int (*callback)(void*, int, char**, char**) 回调函数用于执行完SQL语句之后的结果集。如果不使用则设为 NULL
  4. void* 回调函数的第一个参数。
  5. char **errmsg 错误语句。不设为 NULL 并且没有发生错误,则函数 sqlite3_exec() 在返回之前将该参数的指针设置为 NULL

If an sqlite3_exec() callback returns non-zero, the sqlite3_exec() routine returns SQLITE_ABORT without invoking the callback again and without running any subsequent SQL statements.

如果sqlite3_exec() 执行的callback回调函数返回非零,则sqlite3_exec() 例程返回 SQLITE_ABORT,而不会再次调用callback,也不会运行任何后续SQL语句。

执行成功就返回 SQLITE_OK

2.2.1 C语言案例

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

void errorMessage(sqlite3 *db, const char *errMsg);
int callback(void *NotUsed, int argc, char **argv, char **azColName);

int main(int argc, char *argv[]) {
   
    char *filename = "database.db";     /* Database filename */
    sqlite3 *db = NULL
  • 37
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值