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

news2024/11/26 13:25:00

一、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.coloradmin.cn/o/1208106.html

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

相关文章

005、Nvidia Jetson Nano Developer KIT(b01)-硬件配置

之——设备监视与控制 杂谈 要做个小项目&#xff0c;很多外设设置记录一下。 正文 1.jtop安装 之前写的里有&#xff0c;jtop监视器可以很方便地查看整个设备的运行状态&#xff1a;基本环境配置 它提供了有关计算机硬件使用情况的详细信息。在jtop的界面中&#xff0c;可以显…

如何利用IP代理进行海外推广?

在当今数字化的时代&#xff0c;网络营销已经成为企业策略的重要组成部分。而对于进去海外市场的跨境玩家来说&#xff0c;海外的推广推广是重中之重。然而&#xff0c;在开展推广的过程中&#xff0c;我们常常会遇到各种挑战&#xff0c;如地域限制、访问速度慢等。 为了解决…

如果不用Baklib,哪一个帮助中心工具能够替代它?

在各行各业进入“留量时代”的当下&#xff0c;让用户获得良好的体验和留存老客户变得更为关键&#xff0c;这对于企业的客户服务提出了更高的要求。在使用各类互联网产品时&#xff0c;用户更倾向于通过自助方式寻找答案并解决问题&#xff0c;因此帮助中心的重要性也在不断提…

Eclipse使用配置tomcat服务:未识别的web项目

问题1&#xff1a;未识别的项目 解决&#xff1a;elispse未识别到改项目为Web项目

【LeetCode刷题-双指针】--674.最长连续递增序列

674.最长连续递增序列 class Solution {public int findLengthOfLCIS(int[] nums) {int n nums.length,i 0,j 0,res 0;while(j < n){if( j>0 && nums[j-1] > nums[j]){i j;}j;res Math.max(res,j - i);}return res;} }

Eclipse使用配置tomcat服务:五个地方配置JDK

添加Server配置jdk [这里是tomcat运行的jdk为1.7] 不影响项目本身编译的jdk1.6及系统环境的jdk1.6 &#xff1a;tomcat运行的jdk 项目JDK配置&#xff1a; &#xff1a;开发JDK &#xff1a;编译JDK &#xff1a;eclipse使用jdk

基于谐波参数空间的卷积神经网络自动三维牙齿分割

论文连接&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S1524070320300151 机构&#xff1a; a英国卡迪夫大学计算机科学与信息学院 b中国科学院大学北京 c中国科学院计算技术研究所北京 d深圳大数据研究院&#xff0c;深圳518172 代码链接&#x…

高频CSS面试题

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;web前端面试题库 BFC 块级格式上下文(block format context)是页面一块独立的渲染区域&#xff0c;具有一套独立的渲染规则 内部的…

leetcode刷题日记:121. Best Time to Buy and Sell Stock( 买卖股票的最佳时机)

题目给了我们一组数prices&#xff0c;其中prices[i]表示第i天的股票价格&#xff0c;需要我们求出买卖股票所能获得的最大收益。 我们的第一想法就是从算出每一种买卖股票的情况然后求出里面的最大值&#xff0c;这样我们就能得到最大收益是多少&#xff0c;但是这种情况过于复…

[文件读取]coldfusion 文件读取 (CVE-2010-2861)

1.1漏洞描述 漏洞编号CVE-2010-2861漏洞类型文件读取漏洞等级⭐⭐漏洞环境VULFOCUS攻击方式 描述: Adobe ColdFusion是美国Adobe公司的一款动态Web服务器产品&#xff0c;其运行的CFML&#xff08;ColdFusion Markup Language&#xff09;是针对Web应用的一种程序设计语言。 A…

VBA技术资料MF82:替换文件夹中文件名中的字符

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

基于51单片机电子钟温度计数码显示设计( proteus仿真+程序+设计报告+讲解视频)

这里写目录标题 ✅1.主要功能&#xff1a;✅讲解视频&#xff1a;✅2.仿真设计✅3. 程序代码✅4. 设计报告✅5. 设计资料内容清单&&下载链接✅[资料下载链接&#xff1a;](https://docs.qq.com/doc/DS0Nja3BaQmVtWUpZ) 基于51单片机电子钟温度检测数码显示设计( proteu…

企业为什么要做软文营销推广

数字化时代的来临使企业推广方式发生变化&#xff0c;软文营销推广成为企业推广的常用方式之一&#xff0c;今天媒介盒子就来和大家聊聊&#xff0c;为什么企业需要做软文营销推广。 一、 第三视角传播品牌&#xff0c;提升受众接受度 传统广告的叙事方式是企业站出来&#x…

μC/OS-II---Task管理2(os_task.c)

目录 改变Task优先级Task挂起Task恢复Task信息获取Task调度器上锁&#xff08;os_core.c&#xff09;Task调度器开锁&#xff08;os_core.c&#xff09; 改变Task优先级 #if OS_TASK_CHANGE_PRIO_EN > 0u INT8U OSTaskChangePrio (INT8U oldprio,INT8U newprio) { #if (…

Hazelcast系列(九):Map(一)加载和存储

系列文章 Hazelcast系列(一)&#xff1a;初识hazelcast Hazelcast系列(二)&#xff1a;hazelcast集成&#xff08;嵌入式&#xff09; Hazelcast系列(三)&#xff1a;hazelcast集成&#xff08;服务器/客户端&#xff09; Hazelcast系列(四)&#xff1a;hazelcast管理中心 …

3. 【自动驾驶和机器人中的SLAM技术】实现基于预积分和图优化的GNSS+IMU+Odom的融合定位系统

目录 1. 公式推导2. GNSSIMUOdom融合定位3. 利用数值求导工具&#xff0c;验证本书实验中的雅可比矩阵的正确性4. 也欢迎大家来我公众号读书--“过千帆” 1. 公式推导 2. GNSSIMUOdom融合定位 程序实现以及运行效果&#xff1a; ①首先是在预积分程序中记录了预积分积累的IMU数…

竞赛 题目:基于python的验证码识别 - 机器视觉 验证码识别

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于pyt…

超详细!必看!!STM32--时钟树原理

一、什么是时钟&#xff1f; 时钟是单片机的脉搏&#xff0c;是系统工作的同步节拍。单片机上至CPU&#xff0c;下至总线外设&#xff0c;它们工作时序的配合&#xff0c;都需要一个同步的时钟信号来统一指挥。时钟信号是周期性的脉冲信号。 二、什么是时钟树&#xff1f; S…

Pikachu(皮卡丘靶场)初识XSS(常见标签事件及payload总结)

目录 1、反射型xss(get) 2、反射性xss(post) 3、存储型xss 4、DOM型xss 5、DOM型xss-x XSS又叫跨站脚本攻击&#xff0c;是HTML代码注入&#xff0c;通过对网页注入浏览器可执行代码&#xff0c;从而实现攻击。 ​ 1、反射型xss(get) Which NBA player do you like? 由…

【Mycat2实战】一、Mycat简介

1. 什么是Mycat 什么是Mycat Mycat是数据库中间件&#xff0c;所谓中间件数据库中间件是连接Java应用程序和数据库中间的软件。 为什么要用Mycat 遇到问题&#xff1a; Java与数据库的紧耦合高访问量高并发对数据库的压力读写请求数据不一致 2. Mycat与其他中间件区别 目前的…