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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【游戏开发算法每日一记】使用随机prime算法生成错综复杂效果的迷宫(C#,C++和Unity版)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

Python小白之PyCharm仍然显示“No module named ‘xlwings‘”

Python小白之“没有名称为xlwings‘的模块”-CSDN博客文章浏览阅读8次。cmd 打开命令行&#xff0c;输入python出现>>>的提示格&#xff0c;输入import xlwings 回车&#xff0c;正常报错&#xff1a;No module named xlwings。输入python 回车后&#xff0c;再输入im…

宏观角度认识递归之求根节点到叶节点数字之和

LCR 049. 求根节点到叶节点数字之和 - 力扣&#xff08;LeetCode&#xff09; 理解题意分析子问题&#xff1a;给一个头节点&#xff0c;要返回该头结点左右子树的根结点到叶节点数字和。此处还需注意&#xff1a;在获取根结点到叶节点数字和的时候&#xff0c;要传递一个参数&…

openGauss学习笔记-121 openGauss 数据库管理-设置密态等值查询-使用JDBC操作密态数据库

文章目录 openGauss学习笔记-121 openGauss 数据库管理-设置密态等值查询-使用JDBC操作密态数据库121.1 连接密态数据库121.2 调用isValid方法刷新缓存示例121.3 执行密态等值查询相关的创建密钥语句121.4 执行密态等值查询相关的创建加密表的语句121.5 执行加密表的预编译SQL语…

ACM练习——第三天

今天继续练习C和ACM模式 在写题之前先了解一些新的知识 1.#include <algorithm> #include <algorithm> 是 C 标准库中的头文件之一&#xff0c;其中包含了一系列用于处理各种容器&#xff08;如数组、向量、列表等&#xff09;和其他数据结构的算法。这个头文件提供…

【Liunx】DHCP服务

【Liunx】DHCP服务 DHCP概述A.安装dhcpB.查看配置文件C.修改配置文件 DHCP概述 DHCP(Dynamic Host Configuration Protocol)i动态主机配置协议 DHCP是由Internet工作任务小组设计开发的&#xff0c;专门用于为TCP/IP网络中的计算机自动分配TCP/IP参数的协议。 口使用DHCP服务的…

使用PHP编写采集药品官方数据的程序

目录 一、引言 二、程序设计和实现 1、确定采集目标 2、使用PHP的cURL库进行数据采集 3、解析JSON数据 4、数据处理和存储 5、数据验证和清理 6、数据输出和可视化 7、数据分析和挖掘 三、注意事项 1、合法性原则 2、准确性原则 3、完整性原则 4、隐私保护原则 …

【避雷帖!】安美酷便携屏(安美特)

强烈建议别购买京东安美酷便携屏&#xff0c;太脆弱了&#xff0c;一碰就坏&#xff0c;客服态度不行&#xff0c;容易闪屏等等缺点。而且价格偏贵&#xff0c;淘宝上两百块的屏幕足够用了&#xff0c;没必要花六百多块钱&#xff0c;如果就是买来打游戏的话&#xff0c;也用不…

Adobe 2023 全家桶最终版,一键安装,永久免费,赶紧收藏!(win/mac)

文件名称 Adobe 2023 全家桶最终版 支持系统 windows、mac 获取方式 文章底部 分享形式 百度网盘 小励花了一天的时间给大家整理上传了这份最终版全家桶&#xff0c;全部一键安装即可&#xff0c;无需激活&#xff0c;安装以后即可永久使用&#xff0c;觉得给力的小伙伴…

1688往微信小程序自营商城铺货商品采集API接口

一、背景介绍 随着移动互联网的快速发展&#xff0c;微信小程序作为一种新型的电商形态&#xff0c;正逐渐成为广大商家拓展销售渠道、提升品牌影响力的重要平台。然而&#xff0c;对于许多传统企业而言&#xff0c;如何将商品信息快速、准确地铺货到微信小程序自营商城是一个…

VMware 安装CentOS7

一、软件准备 VMware 虚拟机安装 官网下载链接&#xff1a;VMware pro 17 下载链接 下载 VMware Workstation Pro | CN vm安装教学就不在细说&#xff0c;纯傻瓜式安装 Centos 7镜像文件下载 下载地址&#xff1a; Index of /centos/ | 清华大学开源软件镜像站 | Tsinghua O…

算法笔记——递归(1)

这里写目录标题 递归的思想序列求最大值翻转字符串斐波那契数列数塔回文字符串上楼汉诺塔棋盘覆盖问题数字螺旋矩阵盒分形 递归的思想 子问题须与原始问题为同样的事&#xff0c;且更为简单。 不能无限制地调用本身&#xff0c;须有个出口&#xff0c;化简为非递归状况处理 序…

【中间件篇-Redis缓存数据库05】Redis集群高可用高并发

Redis集群 Redis Cluster是Redis的分布式解决方案&#xff0c;在3.0版本正式推出&#xff0c;有效地解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时&#xff0c;可以采用Cluster架构方案达到负载均衡的目的。之前,Redis分布式方案一般有两种: 1、客户端分…

【unity插件】Shader实现UGUI的特效——UIEffect为 Unity UI 提供视觉效果组件

文章目录 前言地址描述Demo 演示Installation 安装如何玩演示用法使用示例完结 前言 一般的shader无法直接使用在UI上&#xff0c;需要在shader中定义特定的面板参数&#xff0c;今天就来推荐github上大佬做的一套开源的一系列UGUI&#xff0c;Shader实现的特效——UIEffect 为…

KODExplorer中ace.js代码编辑器中自定义PHP提示片段

目录 KODExplorerace.js参考 KODExplorer 这是搭建云盘工具&#xff0c;该工具可以作为在线开发工具使用&#xff0c;其中使用了ace.js作为编辑器&#xff0c;这里主要讲解ace.js编辑器中如何自定义代码提示下载旧版本&#xff0c;再升级到新版本&#xff0c;直接下载新版本没…

【Axure高保真原型】3D饼图_移入显示数据标签

今天和大家分享3D饼图_移入显示数据标签的原型模板&#xff0c;鼠标移入扇形区域时&#xff0c;对应区域会变绿&#xff0c;可以查看该区域对应的项目、数据和占比&#xff0c;这个原型模板是用Axure原生元件制作的&#xff0c;所以无需联网&#xff0c;而且可以自由修改样式、…

4种互斥机制比较

4种互斥机制 关中断禁止任务切换信号量互斥信号量 关中断 关中断&#xff08;Disable Interrupts&#xff09;&#xff1a;通过禁用中断来实现互斥。在关中断期间&#xff0c;任何中断请求都会被忽略&#xff0c;从而确保了临界区的独占性。然而&#xff0c;这种方法会导致系统…

基于Python实现汽车销售数据可视化【500010086】

导入模块 import numpy as np import pandas as pd import plotly.graph_objects as go import plotly.express as px获取数据 df1 pd.read_excel(r"./data/中国汽车总体销量.xlsx") print(df1.head(5))df1.info()df1[年份] df1[时间].dt.year df1[月份] df1[时…

Fourier分析导论——第5章——实数据R上的Fourier变换(E.M. Stein R. Shakarchi)

第5章 实数域ℝ上的Fourier变换 The theory of Fourier series and integrals has always had major difficulties and necessitated a large math- ematical apparatus in dealing with questions of con- vergence. It engendered the development of methods of summa…

CTFhub-RCE-读取源代码

源代码&#xff1a; <?php error_reporting(E_ALL); if (isset($_GET[file])) { if ( substr($_GET["file"], 0, 6) "php://" ) { include($_GET["file"]); } else { echo "Hacker!!!"; } } else {…