Bootstrap

【SQLite】的使用及指令| 编程操作(增删改查)

一、SQLite 使用和指令集

  • SQLite 的基本使用
  • SQL 命令

二、常见的 SQL 数据类型
三、SQLite的命令用法
四、SQLite的编程操作
五、sqlite3_open函数
六、sqlite3_close函数
七、sqlite3_errcode函数
八、SQLite C Interface
九、sqlite3_exec函数
十、callback回调函数
十一、创建表的C接口

  • C代码执行SQL语句
  • C代码建表和插入数据

十二、创建 CREATE 表
十三、插入数据 INSERT 到创建的表中
十四、查询数据 SELECT 操作
十五、更新数据 UPDATE 操作
十六、删除数据 DELETE 操作

一、SQLite 使用和指令集

SQLite 是一个无服务器、零配置、自给自足的嵌入式 SQL 数据库引擎。它的使用非常简单,适合于小型项目和嵌入式设备。
以下是一些基本的 SQLite 使用和指令集:

SQLite 的基本使用:

  1. 连接到数据库:

    sqlite3 database_name.db
    

    在这里,database_name.db 是你要连接的数据库文件名。如果文件不存在,SQLite 会创建一个新的数据库文件。

  2. 退出 SQLite Shell:

    .exit
    

    或者按 Ctrl + D。

SQL 命令:

在 SQLite Shell 中,你可以执行标准的 SQL 命令。

  1. 创建表:

    CREATE TABLE table_name (
        column1 datatype,
        column2 datatype,
        ...
    );
    
  2. 插入数据:

    INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
    
  3. 查询数据:

    SELECT column1, column2, ... FROM table_name WHERE condition;
    
  4. 更新数据:

    UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;
    
  5. 删除数据:

    DELETE FROM table_name WHERE condition;
    
  6. 查询所有表:

    .tables
    
  7. 查看表结构:

    .schema table_name
    
  8. 导入 SQL 脚本:

    .read path/to/script.sql
    

    示例:

创建一个表:

CREATE TABLE users (
    id INTEGER PRIMARY KEY,
    name TEXT,
    age INTEGER
);

插入数据:

INSERT INTO users (name, age) VALUES ('John', 25);
INSERT INTO users (name, age) VALUES ('Alice', 30);

查询数据:

SELECT * FROM users;

更新数据:

UPDATE users SET age = 26 WHERE name = 'John';

删除数据:

DELETE FROM users WHERE name = 'Alice';

这只是 SQLite 的基本用法,你可以根据需要使用更复杂的查询、事务等功能。在实际应用中,你可能需要在编程语言中使用 SQLite API 进行更灵活的数据库操作。

二、常见的 SQL 数据类型

在 SQL 中,你可以使用不同的数据类型来定义表中的列。下面是一些常见的 SQL 数据类型:

  1. 整数类型:

    • INT:整数类型,通常用于存储常规整数。
    • BIGINT:大整数类型,用于存储大范围的整数。
    • SMALLINT:小整数类型,用于存储较小范围的整数。

    示例:

    CREATE TABLE ExampleTable (
        column1 INT,
        column2 BIGINT,
        column3 SMALLINT
    );
    
  2. 浮点数和定点数类型:

    • FLOAT:浮点数类型,用于存储近似值。
    • DOUBLE:双精度浮点数类型,提供更高的精度。
    • DECIMALNUMERIC:定点数类型,用于存储精确值,通常用于货币等需要精确计算的场景。

    示例:

    CREATE TABLE ExampleTable (
        column1 FLOAT,
        column2 DOUBLE,
        column3 DECIMAL(10, 2)
    );
    
  3. 日期和时间类型:

    • DATE:仅包含日期部分。
    • TIME:仅包含时间部分。
    • DATETIMETIMESTAMP:同时包含日期和时间。

    示例:

    CREATE TABLE ExampleTable (
        column1 DATE,
        column2 TIME,
        column3 DATETIME
    );
    
  4. 字符和文本类型:

    • CHAR(n):固定长度的字符串,n 表示字符数。
    • VARCHAR(n):可变长度的字符串,n 表示最大字符数。
    • TEXT:用于存储大段文本。

    示例:

    CREATE TABLE ExampleTable (
        column1 CHAR(10),
        column2 VARCHAR(255),
        column3 TEXT
    );
    

这些只是 SQL 中一些常见的数据类型。具体的数据库系统可能支持不同的类型或提供额外的类型。在定义表时,选择适当的数据类型是确保数据存储有效性和性能的重要一步。

三、SQLite的命令用法

1、创建一个数据库

  • 方式一:
1、 sqlite3        //进入数据库
2.open test1.db
3..quit         //退出
数据库退出后在命令当前路径创建数据库 test1.db

在这里插入图片描述

  • 方式二:
sqlite3 mydemo.db        //在命令运行当前窗口创建数据库 mydemo.db
在数据库命令下
.databases        //列出当前打开的数据库
.quit         //退出

在这里插入图片描述
2、创建一张表格

create table student(id Integer,name char,score float); //Integer:int

如果在表中包含浮点型和其他类型的列,可以使用相应的数据类型。
下面是一个示例,包含了整数、浮点数和字符列:

CREATE TABLE stu2 (
    id INTEGER,
    name CHAR(50),
    score INTEGER,
    gpa FLOAT,
    grade VARCHAR(2)
);

在上面的示例中,gpa 列使用了 FLOAT 类型,表示浮点数,而 grade 列使用了 VARCHAR 类型,表示字符。可以根据需要选择合适的数据类型,确保它们能够正确地存储的数据。
在这里插入图片描述
在这里插入图片描述
3、插入一条记录到表中

insert into student values(1903031144, 'gali', 98); 
insert into student values(1903031145, 'niangao', 99.5);
insert into student(name, score) values('tanshao', 100); 插入部分字段内容

4、查看数据库的记录

.table 							//查看当前有几张表
select * from student;          //查询所有字段的结果 
select name,score from student; //查询数据库中部分字段的内容

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、删除表中一条记录

delete from student where name = 'tanshao';
//delete from student where id = 1903031145;

在这里插入图片描述
6、更改一条表中记录

update student set score = 95 where id = 002;
//update student set id = 1 where name = 'GALINIANGAO';

在这里插入图片描述
7、删除一张表

drop table student;

在这里插入图片描述
8、增加一列

alter table student add column sex char;
alter table student add column num Integer;

在这里插入图片描述

四、SQLite的编程操作

C/C++ 接口 API
以下是重要的 C&C++ / SQLite 接口程序,可以满足您在 C/C++ 程序中使用 SQLite 数据库的需求。如果您需要了解更多细节,请查看 SQLite 官方文档。

序号API & 描述
1sqlite3_open(const char *filename, sqlite3 **ppDb)
该例程打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据库连接对象。
如果 filename 参数是 NULL 或 ‘:memory:’,那么 sqlite3_open() 将会在 RAM 中创建一个内存数据库,这只会在 session 的有效时间内持续。
如果文件名 filename 不为 NULL,那么 sqlite3_open() 将使用这个参数值尝试打开数据库文件。如果该名称的文件不存在,sqlite3_open() 将创建一个新的命名为该名称的数据库文件并打开。
2sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
该例程提供了一个执行 SQL 命令的快捷方式,SQL 命令由 sql 参数提供,可以由多个 SQL 命令组成。
在这里,第一个参数 sqlite3 是打开的数据库对象,sqlite_callback 是一个回调,data 作为其第一个参数,errmsg 将被返回用来获取程序生成的任何错误。
sqlite3_exec() 程序解析并执行由 sql 参数所给的每个命令,直到字符串结束或者遇到错误为止。
3sqlite3_close(sqlite3*)
该例程关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完成。
如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。
4sqlite3_errcode(sqlite3 *db)
通常用来获取最近调用的API接口返回的错误代码。
const char *sqlite3_errmsg(sqlite3 *db);

五、sqlite3_open函数

sqlite3_open是SQLite库中的一个函数,用于打开或创建一个SQLite数据库文件,并返回一个指向该数据库的连接对象。以下是关于sqlite3_open函数的一些关键信息:

函数签名:

int sqlite3_open(
  const char *filename,   /* 数据库文件的路径或 ":memory:" 用于在内存中创建数据库 */
  sqlite3 **ppDb          /* 用于存储数据库连接对象的指针 */
);

参数:

  • filename:要打开或创建的数据库文件的路径。如果为NULL或者指定为":memory:",则在内存中创建一个临时数据库。

  • ppDb:用于存储指向数据库连接对象的指针的地址。在函数成功调用后,这个指针将指向一个新的sqlite3对象,可以用于后续的数据库操作。

返回值:

  • 如果操作成功,返回SQLITE_OK(0)。
  • 如果出现错误,返回一个错误代码。常见的错误代码包括SQLITE_CANTOPEN(不能打开数据库文件)和SQLITE_MISUSE(错误的使用方式)等。

示例用法:

#include <sqlite3.h>

int main() {
    sqlite3 *db; // SQLite数据库连接对象
    int rc = sqlite3_open("mydatabase.db", &db); // 打开或创建名为"mydatabase.db"的数据库文件

    if (rc != SQLITE_OK) {
        // 处理错误
        fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
        return rc;
    }

    // 在这里可以进行其他数据库操作

    sqlite3_close(db); // 关闭数据库连接

    return 0;
}

这个例子演示了如何使用sqlite3_open函数打开或创建一个数据库文件,并在操作完成后使用sqlite3_close函数关闭数据库连接。在实际使用中,你可能需要根据具体需求处理更多的错误和数据库操作。

六、sqlite3_close函数

sqlite3_close是SQLite库中的函数之一,用于关闭之前通过sqlite3_open打开的数据库连接。以下是有关sqlite3_close函数的一些关键信息:

函数签名:

int sqlite3_close(sqlite3 *db);

参数:

  • db:指向要关闭的数据库连接对象的指针。

返回值:

  • 如果操作成功,返回SQLITE_OK(0)。
  • 如果出现错误,返回一个错误代码。常见的错误代码包括SQLITE_BUSY(数据库仍有活动的语句)和SQLITE_MISUSE(错误的使用方式)等。

示例用法:

#include <sqlite3.h>

int main() {
    sqlite3 *db; // SQLite数据库连接对象
    int rc = sqlite3_open("mydatabase.db", &db); // 打开或创建名为"mydatabase.db"的数据库文件

    if (rc != SQLITE_OK) {
        // 处理错误
        fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
        return rc;
    }

    // 在这里可以进行其他数据库操作

    rc = sqlite3_close(db); // 关闭数据库连接

    if (rc != SQLITE_OK) {
        // 处理关闭错误
        fprintf(stderr, "Cannot close database: %s\n", sqlite3_errmsg(db));
        return rc;
    }

    return 0;
}

这个例子演示了如何使用sqlite3_close函数关闭通过sqlite3_open打开的数据库连接。在实际使用中,你可能需要根据具体需求处理更多的错误和其他数据库操作。值得注意的是,关闭数据库连接之前,应确保所有相关的数据库操作已经完成。

七、sqlite3_errcode函数

sqlite3_errcode是SQLite库中的一个函数,用于获取与最后一次数据库操作相关的错误代码。以下是有关sqlite3_errcode函数的一些关键信息:

函数签名:

int sqlite3_errcode(sqlite3 *db);

参数:

  • db:已经打开的SQLite数据库连接对象。

返回值:

  • 返回与最后一次数据库操作相关的错误代码。如果之前的操作没有错误,将返回SQLITE_OK(0)。

示例用法:

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

int main() {
    sqlite3 *db;
    char *errmsg = 0;

    // 打开数据库连接
    int rc = sqlite3_open("nonexistent.db", &db);

    if (rc != SQLITE_OK) {
        fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
        
        // 获取与最后一次数据库操作相关的错误代码
        int errcode = sqlite3_errcode(db);
        fprintf(stderr, "Error code: %d\n", errcode);
    }

    // 关闭数据库连接
    sqlite3_close(db);

    return 0;
}

在这个例子中,sqlite3_errcode函数用于获取与最后一次数据库操作相关的错误代码。在这里,我们试图打开一个不存在的数据库文件,因此sqlite3_open函数将返回错误。然后,我们使用sqlite3_errcode来获取错误代码,并将其输出到控制台。在实际使用中,你可以根据这个错误代码进行相应的错误处理。

八、SQLite C Interface

SQLite C 接口
结果代码

Result Codes

#define SQLITE_OK           0   /* Successful result */
/* beginning-of-error-codes */错误代码
#define SQLITE_ERROR        1   /* Generic error */一般错误
#define SQLITE_INTERNAL     2   /* Internal logic error in SQLite */内部逻辑错误
#define SQLITE_PERM         3   /* Access permission denied */访问权限被拒绝
#define SQLITE_ABORT        4   /* Callback routine requested an abort */回调例程请求中止
#define SQLITE_BUSY         5   /* The database file is locked */数据库文件被锁定
#define SQLITE_LOCKED       6   /* A table in the database is locked */数据库中的某个表被锁定
#define SQLITE_NOMEM        7   /* A malloc() failed */malloc() 失败
#define SQLITE_READONLY     8   /* Attempt to write a readonly database */尝试写入只读数据库
#define SQLITE_INTERRUPT    9   /* Operation terminated by sqlite3_interrupt() */操作由 sqlite3_interrupt() 终止
#define SQLITE_IOERR       10   /* Some kind of disk I/O error occurred */发生某种磁盘 I/O 错误
#define SQLITE_CORRUPT     11   /* The database disk image is malformed */数据库磁盘映像格式错误
#define SQLITE_NOTFOUND    12   /* Unknown opcode in sqlite3_file_control() */sqlite3_file_control() 中的未知操作码
#define SQLITE_FULL        13   /* Insertion failed because database is full */由于数据库已满,插入失败
#define SQLITE_CANTOPEN    14   /* Unable to open the database file */无法打开数据库文件
#define SQLITE_PROTOCOL    15   /* Database lock protocol error */数据库锁定协议错误
#define SQLITE_EMPTY       16   /* Internal use only */仅供内部使用
#define SQLITE_SCHEMA      17   /* The database schema changed */数据库架构已更改
#define SQLITE_TOOBIG      18   /* String or BLOB exceeds size limit */字符串或 BLOB 超出大小限制
#define SQLITE_CONSTRAINT  19   /* Abort due to constraint violation */由于违反约束而中止
#define SQLITE_MISMATCH    20   /* Data type mismatch */数据类型不匹配
#define SQLITE_MISUSE      21   /* Library used incorrectly */库使用不正确
#define SQLITE_NOLFS       22   /* Uses OS features not supported on host */使用主机不支持的 OF 功能
#define SQLITE_AUTH        23   /* Authorization denied */授权被拒绝
#define SQLITE_FORMAT      24   /* Not used */不曾用过
#define SQLITE_RANGE       25   /* 2nd parameter to sqlite3_bind out of range */sqlite3_bind 的第二个参数超出范围
#define SQLITE_NOTADB      26   /* File opened that is not a database file */打开的文件不是数据库文件
#define SQLITE_NOTICE      27   /* Notifications from sqlite3_log() */来自 sqlite3_log() 的通知
#define SQLITE_WARNING     28   /* Warnings from sqlite3_log() */来自 sqlite3_log() 的警告
#define SQLITE_ROW         100  /* sqlite3_step() has another row ready */sqlite3_step() 已准备好另一行
#define SQLITE_DONE        101  /* sqlite3_step() has finished executing */sqlite3_step() 已完成执行
/* end-of-error-codes */

Many SQLite functions return an integer result code from the set shown here in order to indicate success or failure.
许多 SQLite 函数从此处显示的集合中返回一个整数结果代码,以指示成功或失败。
New error codes may be added in future versions of SQLite.
SQLite 的未来版本中可能会添加新的错误代码。
See also: extended result code definitions
另请参阅:扩展结果代码定义
See also lists of Objects, Constants, and Functions.
另请参阅对象、常量和函数的列表。

opensqlite.c

#include <stdio.h>
#include <sqlite3.h>
 
int main(char argc, char **argv)
{
    sqlite3 *db;
    int ret;//返回值编号
 
    if(argc < 2){
        printf("Usage: %s xxx.db\n",argv[0]);
        return -1;
    }
 
    if( (ret = sqlite3_open(argv[1],&db)) == SQLITE_OK){
        printf("open %s success\n",argv[1]);
    }else{
        printf("error:%s,%d\n",sqlite3_errmsg(db),ret);
        if(ret == SQLITE_CANTOPEN){//无法打开数据库文件
            printf("permission denied.\n");
        }
        return -1;
    }
 
    sqlite3_close(db);
    printf("done\n");
    
    return 0;
}

在这里插入图片描述
下面的 C 代码段显示了如何连接到一个现有的数据库。如果数据库不存在,那么它就会被创建,最后将返回一个数据库对象。

#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
 
int main(int argc, char* argv[])
{
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;
 
    rc = sqlite3_open("test.db", &db);
    
    if( rc ){
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        exit(0);
    }else{
        fprintf(stderr, "Opened database successfully\n");
    }
    sqlite3_close(db);
}

九、sqlite3_exec函数

sqlite3_exec是SQLite库中的一个函数,用于执行一个或多个SQL语句,并通过回调函数处理结果。以下是有关sqlite3_exec函数的一些关键信息:

函数签名:

int sqlite3_exec(
  sqlite3* db,                     /* 打开的数据库对象 */
  const char *sql,                 /* 要执行的SQL语句 */
  int (*callback)(void*,int,char**,char**),  /* 回调函数,处理执行结果 */
  void *data,                      /* 传递给回调函数的数据指针 */
  char **errmsg                    /* 用于存储错误消息的指针 */
);

参数:

  • db:已经打开的SQLite数据库连接对象。

  • sql:要执行的SQL语句。可以包含一个或多个SQL命令,以分号分隔。

  • callback:回调函数,用于处理每个结果行。该函数的签名应该为int callback(void*, int, char**, char**),其中参数分别是用户定义的数据指针(data)、列数、列的数据数组、列的名称数组。

  • data:传递给回调函数的用户定义的数据指针。

  • errmsg:用于存储错误消息的指针。如果执行过程中发生错误,该指针将指向包含错误消息的字符串。

返回值:

  • 如果操作成功,返回SQLITE_OK(0)。
  • 如果出现错误,返回一个错误代码。常见的错误代码包括SQLITE_ERROR(SQL语句执行错误)和SQLITE_MISUSE(错误的使用方式)等。

示例用法:

#include <sqlite3.h>

// 回调函数,处理每一行的结果
int callback(void *data, int argc, char **argv, char **colNames) {
    // 在这里处理每一行的数据
    for (int i = 0; i < argc; i++) {
        printf("%s = %s\n", colNames[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0; // 返回0表示继续处理下一行
}

int main() {
    sqlite3 *db;
    char *errmsg = 0;

    // 打开数据库连接
    int rc = sqlite3_open("mydatabase.db", &db);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
        return rc;
    }

    // 执行SQL语句,并使用回调函数处理结果
    rc = sqlite3_exec(db, "SELECT * FROM mytable;", callback, 0, &errmsg);

    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", errmsg);
        sqlite3_free(errmsg); // 释放错误消息的内存
    }

    // 关闭数据库连接
    sqlite3_close(db);

    return 0;
}

这个例子演示了如何使用sqlite3_exec函数执行一个SELECT语句,并通过回调函数处理每一行的结果。在实际使用中,你可以根据需要执行其他类型的SQL语句,并相应地处理回调函数。

十、callback回调函数

回调函数

在SQLite中,sqlite3_exec函数通常与回调函数一起使用,以处理执行SQL语句后的结果。回调函数是在每个结果行上调用的用户定义的函数,用于处理查询结果。

以下是回调函数的基本签名:

int callback(void *data, int argc, char **argv, char **colNames);
  • void *data: 用户提供的数据指针,可以用于传递额外的信息给回调函数。

  • int argc: 结果集的列数。

  • char **argv: 包含每一列的值的数组。

  • char **colNames: 包含每一列名称的数组。

回调函数应该返回一个整数值,通常为0。如果返回非零值,sqlite3_exec函数将停止执行并返回相同的值。

以下是一个简单的示例,演示如何使用sqlite3_exec与回调函数处理查询结果:

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

// 回调函数
int callback(void *data, int argc, char **argv, char **colNames) {
    printf("Callback function:\n");

    for (int i = 0; i < argc; i++) {
        printf("%s = %s\n", colNames[i], argv[i] ? argv[i] : "NULL");
    }

    printf("\n");
    return 0;  // 返回0表示继续处理下一行
}

int main() {
    sqlite3 *db;
    char *errmsg = 0;

    // 打开数据库连接
    int rc = sqlite3_open(":memory:", &db);

    if (rc != SQLITE_OK) {
        fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
        return rc;
    }

    // 创建表并插入数据
    rc = sqlite3_exec(db, "CREATE TABLE test (id INT, name TEXT);", 0, 0, &errmsg);
    rc = sqlite3_exec(db, "INSERT INTO test VALUES (1, 'John');", 0, 0, &errmsg);
    rc = sqlite3_exec(db, "INSERT INTO test VALUES (2, 'Jane');", 0, 0, &errmsg);

    // 查询数据,并使用回调函数处理结果
    rc = sqlite3_exec(db, "SELECT * FROM test;", callback, 0, &errmsg);

    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", errmsg);
        sqlite3_free(errmsg); // 释放错误消息的内存
    }

    // 关闭数据库连接
    sqlite3_close(db);

    return 0;
}

在这个例子中,sqlite3_exec用于执行SQL语句,callback函数用于处理每一行的查询结果。你可以根据需要修改回调函数的行为,以适应你的应用程序的需求。

十一、创建表的C接口

C代码执行SQL语句

execsqlite.c

#include <stdio.h>
#include <sqlite3.h>
 
int callback(void *arg, int column_size, char *column_value[], char *column_name[])
{
    int i;
    printf("arg = %s\n", (char *)arg);
    for (i=0; i<column_size; i++){
        printf("%s = %s\n", column_name[i], column_value[i]);
    }
    printf("=======================\n");
    return 0;//必须返回0,这样数据库中有多少条数据,这个回调函数就会被调用多少次
}
 
int main(char argc, char **argv)
{
    sqlite3 *db;
    char *errorMes = NULL;
    int ret;//返回值编号
 
    if (argc < 2){
        printf("Usage: %s xxx.db\n", argv[0]);
        return -1;
    }
 
    if ((ret = sqlite3_open(argv[1], &db)) == SQLITE_OK){
        printf("open %s success\n", argv[1]);
    }else{
        printf("error:%s, %d\n", sqlite3_errmsg(db), ret);
        if (ret == SQLITE_CANTOPEN){//无法打开数据库文件
            printf("permission denied.\n");
        }
        return -1;
    }
 
    //sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
    sqlite3_exec(db, "select * from sut1;", callback, "content of sql:", &errorMes);//errorMes may sigment error!
    
    sqlite3_close(db);
    printf("done\n");
    
    return 0;
}

在这里插入图片描述

C代码建表和插入数据

创建表定义类型插入

#include <stdio.h>
#include <sqlite3.h>
 
int callback(void *arg, int column_size, char *column_value[], char *column_name[])
{
    int i;
    printf("arg = %s\n", (char *)arg);
    for (i=0; i<column_size; i++){
        printf("%s = %s\n", column_name[i], column_value[i]);
    }
    printf("=======================\n");
    return 0;//必须返回0,这样数据库中有多少条数据,这个回调函数就会被调用多少次
}
 
int main(char argc, char **argv)
{
    sqlite3 *db;
    char *errorMes = NULL;
    int ret;//返回值编号
 
    if (argc < 2){
        printf("Usage: %s xxx.db\n", argv[0]);
        return -1;
    }
 
    if ((ret = sqlite3_open(argv[1], &db)) == SQLITE_OK){
        printf("open %s success\n", argv[1]);
    }else{
        printf("error:%s, %d\n", sqlite3_errmsg(db), ret);
        if (ret == SQLITE_CANTOPEN){//无法打开数据库文件
            printf("permission denied\n");
        }
        return -1;
    }
 
    //sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
    ret = sqlite3_exec(db, "create table Class(id INTEGER,name char,score REAL);",callback, "content of sql:", &errorMes);
    if(ret != SQLITE_OK){
        printf("create table error: %s\n",errorMes);
    }
 
    ret = sqlite3_exec(db, "insert into Class values(1998,'GG',82); ",callback, "content of sql:", &errorMes);
    printf("insert: %d,%s\n",ret,errorMes);
 
    sqlite3_exec(db, "select * from Class",callback, "content of sql:", &errorMes);
    printf("select: %d,%s\n",ret,errorMes);
  
    sqlite3_close(db);
    printf("done\n");
    
    return 0;
}

在这里插入图片描述

SQLite 菜鸟教程

十二、创建 CREATE 表

下面的 C 代码段将用于在先前创建的数据库中创建一个COMPANY表:

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h> 
 
static int callback(void *NotUsed, int argc, char **argv, char **azColName){
   int i;
   for(i=0; i<argc; i++){
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}
 
int main(int argc, char* argv[])
{
   sqlite3 *db;
   char *zErrMsg = 0;
   int  rc;
   char *sql;
 
   /* Open database */
   rc = sqlite3_open("test.db", &db);
   if( rc ){
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      exit(0);
   }else{
      fprintf(stdout, "Opened database successfully\n");
   }
 
   /* Create SQL statement */
   sql = "CREATE TABLE COMPANY("  \
         "ID INT PRIMARY KEY     NOT NULL," \
         "NAME           TEXT    NOT NULL," \
         "AGE            INT     NOT NULL," \
         "ADDRESS        CHAR(50)," \
         "SALARY         REAL );";
 
   /* Execute SQL statement */
   rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
   if( rc != SQLITE_OK ){
   fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   }else{
      fprintf(stdout, "Table created successfully\n");
   }
   sqlite3_close(db);
   return 0;
}

上述程序编译和执行时,它会在 test.db 文件中创建 COMPANY 表

十三、插入数据 INSERT 到创建的表中

下面的 C 代码段显示了如何在上面创建的 COMPANY 表中创建记录:

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
 
static int callback(void *NotUsed, int argc, char **argv, char **azColName){
   int i;
   for(i=0; i<argc; i++){
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}
 
int main(int argc, char* argv[])
{
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;
 
   /* Open database */
   rc = sqlite3_open("test.db", &db);
   if( rc ){
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      exit(0);
   }else{
      fprintf(stderr, "Opened database successfully\n");
   }
 
   /* Create SQL statement */
   sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "  \
         "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "  \
         "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); "     \
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
         "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
         "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";
 
   /* Execute SQL statement */
   rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
   if( rc != SQLITE_OK ){
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   }else{
      fprintf(stdout, "Records created successfully\n");
   }
   sqlite3_close(db);
   return 0;
}

上述程序编译和执行时,它会在 COMPANY 表中创建给定记录,并会因为回调return0显示两行
在这里插入图片描述
在这里插入图片描述

十四、查询数据 SELECT 操作

在我们开始讲解获取记录的实例之前,让我们先了解下回调函数的一些细节,这将在我们的实例使用到。这个回调提供了一个从 SELECT 语句获得结果的方式。它声明如下:

typedef int (*sqlite3_callback)(
void*,    /* Data provided in the 4th argument of sqlite3_exec() */
int,      /* The number of columns in row */
char**,   /* An array of strings representing fields in the row */
char**    /* An array of strings representing column names */
);

如果上面的回调在 sqlite_exec() 程序中作为第三个参数,那么 SQLite 将为 SQL 参数内执行的每个 SELECT 语句中处理的每个记录调用这个回调函数。

下面的 C 代码段显示了如何从前面创建的 COMPANY 表中获取并显示记录:

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
 
static int callback(void *data, int argc, char **argv, char **azColName){
   int i;
   fprintf(stderr, "%s: ", (const char*)data);
   for(i=0; i<argc; i++){
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}
 
int main(int argc, char* argv[])
{
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;
   const char* data = "Callback function called";
 
   /* Open database */
   rc = sqlite3_open("test.db", &db);
   if( rc ){
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      exit(0);
   }else{
      fprintf(stderr, "Opened database successfully\n");
   }
 
   /* Create SQL statement */
   sql = "SELECT * from COMPANY";
 
   /* Execute SQL statement */
   rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
   if( rc != SQLITE_OK ){
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   }else{
      fprintf(stdout, "Operation done successfully\n");
   }
   sqlite3_close(db);
   return 0;
}

上述程序编译和执行时,它会产生以下结果:
在这里插入图片描述

十五、更新数据 UPDATE 操作

下面的 C 代码段显示了如何使用 UPDATE 语句来更新任何记录,然后从 COMPANY 表中获取并显示更新的记录:

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h> 
 
static int callback(void *data, int argc, char **argv, char **azColName){
   int i;
   fprintf(stderr, "%s: ", (const char*)data);
   for(i=0; i<argc; i++){
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}
 
int main(int argc, char* argv[])
{
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;
   const char* data = "Callback function called";
 
   /* Open database */
   rc = sqlite3_open("test.db", &db);
   if( rc ){
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      exit(0);
   }else{
      fprintf(stderr, "Opened database successfully\n");
   }
 
   /* Create merged SQL statement */
   sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1; " \
         "SELECT * from COMPANY";
 
   /* Execute SQL statement */
   rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
   if( rc != SQLITE_OK ){
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   }else{
      fprintf(stdout, "Operation done successfully\n");
   }
   sqlite3_close(db);
   return 0;
}

上述程序编译和执行时,它会产生以下结果:
在这里插入图片描述

十六、删除数据 DELETE 操作

下面的 C 代码段显示了如何使用 DELETE 语句删除任何记录,然后从 COMPANY 表中获取并显示剩余的记录:

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h> 
 
static int callback(void *data, int argc, char **argv, char **azColName){
   int i;
   fprintf(stderr, "%s: ", (const char*)data);
   for(i=0; i<argc; i++){
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}
 
int main(int argc, char* argv[])
{
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;
   char *sql;
   const char* data = "Callback function called";
 
   /* Open database */
   rc = sqlite3_open("test.db", &db);
   if( rc ){
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      exit(0);
   }else{
      fprintf(stderr, "Opened database successfully\n");
   }
 
   /* Create merged SQL statement */
   sql = "DELETE from COMPANY where ID=2; " \
         "SELECT * from COMPANY";
 
   /* Execute SQL statement */
   rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
   if( rc != SQLITE_OK ){
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
      sqlite3_free(zErrMsg);
   }else{
      fprintf(stdout, "Operation done successfully\n");
   }
   sqlite3_close(db);
   return 0;
}

上述程序编译和执行时,它会产生以下结果:
在这里插入图片描述

;