【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;
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/145611.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue:如何把后端传过来的数组的其中一个对象加入新的属性

加入我们是更改数组中的第一个对象&#xff0c;在vue中可以使用$set方法将属性插入到第一个对象中作为属性。 Script部分&#xff1a; <script>export default {data() {return {boxes: [//模拟后端传过来的数组{id:1,name:张三},{id:2,name:李四},{id:3,name:王五},{i…

香港科技大学广州|智能制造学域机器人与自主系统学域博士招生宣讲会—中国科学技术大学专场

&#x1f3e0;地点&#xff1a;中国科学技术大学西区学生活动中心&#xff08;一楼&#xff09;报告厅 【宣讲会专场1】让制造更高效、更智能、更可持续—智能制造学域 &#x1f559;时间&#xff1a;2023年11月16日&#xff08;星期四&#xff09;18:00 报名链接&#xff1a…

【SpringBoot篇】使用Spring Cache高效处理缓存数据

文章目录 &#x1f339;简述Spring Cache&#x1f3f3;️‍&#x1f308;常用注解&#x1f33a;使用SpringCache&#x1f6f8;Cacheable注解⭐测试 &#x1f6f8;CacheEvict&#x1f38d;一次清理一条数据&#x1f38d;一次删除多条数据 Spring Cache是一个框架,只要简单加一个…

【Mysql】MySQL基于成本的优化

什么是成本 我们之前说 过MySQL 执行一个查询可以有不同的执行方案&#xff0c;它会选择其中成本最低&#xff0c;或者说代价最低的那种方案去真正的执行查询。那么成本是怎么计算的呢&#xff0c;其实在 MySQL 中一条查询语句的执行成本是由下边这两个方面组成的: I/O 成本 …

数据结构:反射

基本概念 反射中的四个类 Class类 Java文件在被编译之后&#xff0c;生成了.class文件&#xff0c;JVM此时解读.class文件&#xff0c;将其解析为java.lang.Class 对象&#xff0c;在程序运行时每个java文件就最终变成了Class类对象的一个实例。通过反射机制应用这个 实例就…

如何在Qemu上跑Milk-duo开发板

前言 &#xff08;1&#xff09;PLCT实验室实习生长期招聘&#xff1a;招聘信息链接 &#xff08;2&#xff09;学习本文之前&#xff0c;要求先看一下Milk-V Duo快速上手的环境搭建部分&#xff0c;创建好镜像文件。 正文 编译milk-duo qemu &#xff08;1&#xff09;下面步…

No203.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

YOLOv8全网独家优化:IoU系列篇 | Inner-IoU融合MPDIoU,创新十足,2023年11月最新IoU改进

🚀🚀🚀本文改进: Inner-IoU(基于辅助边框的IoU损失)结合MPDIoU进行创新,创新十足,全网首发 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1.Inner-IoU介绍 论文:https://arxiv.org/abs/2311.02…

Python---集合中的交集 、并集 | 与差集 - 特性

用 & 来求两个集合的交集&#xff1a;-----键盘上的7上的符号&#xff0c;shift 7 同时按 用 | 来求两个集合的并集&#xff1a; -----键盘上的7上的符号&#xff0c;shift 同时按&#xff08;就是enter键上面那个|\ &#xff09; 用 - 来求两个集合的差集&#xff…

Vue3-TypeScript-Threejs:导入外部的glb格式3D模型

一、直接上代码&#xff0c;在vue3-typescript-threejs 项目 导入外部的glb格式3D模型 极简代码&#xff0c;快速理解 <template><div ref"container"></div></template><script lang"ts" setup>import { onMounted, ref …

Linux应用层点亮硬件的LED灯

一 应用层操作硬件的两种方法 应用层想要对底层硬件进行操控&#xff0c;通常可以通过两种方式&#xff1a; /dev/目录下的设备文件&#xff08;设备节点&#xff09;&#xff1b;/sys/目录下设备的属性文件。 具体使用哪种方式需要根据不同功能类型设备进行选择&#xff0c;通…

人工智能与充电技术:携手共创智能充电新时代

人工智能与充电技术&#xff1a;携手共创智能充电新时代 摘要&#xff1a;本文探讨了人工智能与充电技术的结合及其在未来充电设施领域的应用。通过分析智能充电系统的技术原理、优势以及挑战&#xff0c;本文展望了由人工智能驱动的充电技术为未来电动交通带来的巨大变革与机…

No202.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

Leetcode—4.寻找两个正序数组的中位数【困难】

2023每日刷题&#xff08;二十九&#xff09; Leetcode—4.寻找两个正序数组的中位数 直接法实现代码 int mid, mid1, mid2; bool findmid(int n, int k, int x) {if(n % 2 1) {if(k n / 2) {mid x;return true;}} else {if(k n / 2 - 1) {mid1 x;} else if(k n / 2) {…

3DMAX渲染AO图的三种方法

3DMAX渲染AO图的三种方法 使用Mental Ray渲染AO 1. 我为这个演示制作了一个非常简单的场景。该场景包含一个茶壶、一个盒子和一个球体。我还应用了一些材质&#xff0c;并将渲染引擎设置为Mental Ray。 2. 我还在场景中添加并定位了几个泛光灯。 3. 我选择了Mental Ra…

主题讲座:全球增材制造现状与未来(暨香港科技大学广州|智能制造学域2024博士学位全额奖学金项目)

时间&#xff1a;2023 年11月16日&#xff08;星期四&#xff09;14:30 地点&#xff1a;合肥工业大学 学术会议中心三楼报告厅 主讲嘉宾&#xff1a;陈模军 助理教授 https://facultyprofiles.hkust-gz.edu.cn/faculty-personal-page/CHEN-Mojun/mjchen 报名表直达&#xff1…

数字化时代,企业如何增加产品销售额

2023作为提振消费年&#xff0c;国民宏观经济环境正在复苏&#xff0c;而数字化技术的进步也使消费者的购买方式发生了翻天覆地的变化&#xff0c;对于企业而言&#xff0c;应该如何顺势而上增加产品销售额&#xff0c;成为其成功的关键。 今天媒介盒子就来和大家聊聊企业如何…

DVWA - 3

文章目录 XSS&#xff08;Dom&#xff09;lowmediumhighimpossible XSS&#xff08;Dom&#xff09; XSS 主要基于JavaScript语言进行恶意攻击&#xff0c;常用于窃取 cookie&#xff0c;越权操作&#xff0c;传播病毒等。DOM全称为Document Object Model&#xff0c;即文档对…

笔试题之指针和数组的精讲

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

谁输了,就往衣服里面倒水,欲望秀场与亲密的操控,当一位女博士生成为主播

在澎湃新闻上&#xff0c;读到香港大学博士生王怡霖的一篇自述文章。 为了研究秀场直播&#xff0c;她跟一家公会签约&#xff0c;当了秀场主播。 感谢王怡霖&#xff0c;愿意做这样的研究&#xff0c;为我们提供了解社会现实的一个观察视角。 三年主播体验观察下来&#xff0c…