【SQLite】的使用及指令| 编程操作(增删改查)_sqlite数据操作语句文档-程序员宅基地

技术标签: 全志H616  sqlite  c语言  linux  数据库  

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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_62140641/article/details/134372996

智能推荐

解决win10/win8/8.1 64位操作系统MT65xx preloader线刷驱动无法安装_mt65驱动-程序员宅基地

文章浏览阅读1.3w次。转载自 http://www.miui.com/thread-2003672-1-1.html 当手机在刷错包或者误修改删除系统文件后会出现无法开机或者是移动定制(联通合约机)版想刷标准版,这时就会用到线刷,首先就是安装线刷驱动。 在XP和win7上线刷是比较方便的,用那个驱动自动安装版,直接就可以安装好,完成线刷。不过现在也有好多机友换成了win8/8.1系统,再使用这个_mt65驱动

SonarQube简介及客户端集成_sonar的客户端区别-程序员宅基地

文章浏览阅读1k次。SonarQube是一个代码质量管理平台,可以扫描监测代码并给出质量评价及修改建议,通过插件机制支持25+中开发语言,可以很容易与gradle\maven\jenkins等工具进行集成,是非常流行的代码质量管控平台。通CheckStyle、findbugs等工具定位不同,SonarQube定位于平台,有完善的管理机制及强大的管理页面,并通过插件支持checkstyle及findbugs等既有的流..._sonar的客户端区别

元学习系列(六):神经图灵机详细分析_神经图灵机方法改进-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏27次。神经图灵机是LSTM、GRU的改进版本,本质上依然包含一个外部记忆结构、可对记忆进行读写操作,主要针对读写操作进行了改进,或者说提出了一种新的读写操作思路。神经图灵机之所以叫这个名字是因为它通过深度学习模型模拟了图灵机,但是我觉得如果先去介绍图灵机的概念,就会搞得很混乱,所以这里主要从神经图灵机改进了LSTM的哪些方面入手进行讲解,同时,由于模型的结构比较复杂,为了让思路更清晰,这次也会分开几..._神经图灵机方法改进

【机器学习】机器学习模型迭代方法(Python)-程序员宅基地

文章浏览阅读2.8k次。一、模型迭代方法机器学习模型在实际应用的场景,通常要根据新增的数据下进行模型的迭代,常见的模型迭代方法有以下几种:1、全量数据重新训练一个模型,直接合并历史训练数据与新增的数据,模型直接离线学习全量数据,学习得到一个全新的模型。优缺点:这也是实际最为常见的模型迭代方式,通常模型效果也是最好的,但这样模型迭代比较耗时,资源耗费比较多,实时性较差,特别是在大数据场景更为困难;2、模型融合的方法,将旧模..._模型迭代

base64图片打成Zip包上传,以及服务端解压的简单实现_base64可以装换zip吗-程序员宅基地

文章浏览阅读2.3k次。1、前言上传图片一般采用异步上传的方式,但是异步上传带来不好的地方,就如果图片有改变或者删除,图片服务器端就会造成浪费。所以有时候就会和参数同步提交。笔者喜欢base64图片一起上传,但是图片过多时就会出现数据丢失等异常。因为tomcat的post请求默认是2M的长度限制。2、解决办法有两种:① 修改tomcat的servel.xml的配置文件,设置 maxPostSize=..._base64可以装换zip吗

Opencv自然场景文本识别系统(源码&教程)_opencv自然场景实时识别文字-程序员宅基地

文章浏览阅读1k次,点赞17次,收藏22次。Opencv自然场景文本识别系统(源码&教程)_opencv自然场景实时识别文字

随便推点

ESXi 快速复制虚拟机脚本_exsi6.7快速克隆centos-程序员宅基地

文章浏览阅读1.3k次。拷贝虚拟机文件时间比较长,因为虚拟机 flat 文件很大,所以要等。脚本完成后,以复制虚拟机文件夹。将以下脚本内容写入文件。_exsi6.7快速克隆centos

好友推荐—基于关系的java和spark代码实现_本关任务:使用 spark core 知识完成 " 好友推荐 " 的程序。-程序员宅基地

文章浏览阅读2k次。本文主要实现基于二度好友的推荐。数学公式参考于:http://blog.csdn.net/qq_14950717/article/details/52197565测试数据为自己随手画的关系图把图片整理成文本信息如下:a b c d e f yb c a f gc a b dd c a e h q re f h d af e a b gg h f bh e g i di j m n ..._本关任务:使用 spark core 知识完成 " 好友推荐 " 的程序。

南京大学-高级程序设计复习总结_南京大学高级程序设计-程序员宅基地

文章浏览阅读367次。南京大学高级程序设计期末复习总结,c++面向对象编程_南京大学高级程序设计

4.朴素贝叶斯分类器实现-matlab_朴素贝叶斯 matlab训练和测试输出-程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏12次。实现朴素贝叶斯分类器,并且根据李航《统计机器学习》第四章提供的数据训练与测试,结果与书中一致分别实现了朴素贝叶斯以及带有laplace平滑的朴素贝叶斯%书中例题实现朴素贝叶斯%特征1的取值集合A1=[1;2;3];%特征2的取值集合A2=[4;5;6];%S M LAValues={A1;A2};%Y的取值集合YValue=[-1;1];%数据集和T=[ 1,4,-1;..._朴素贝叶斯 matlab训练和测试输出

Markdown 文本换行_markdowntext 换行-程序员宅基地

文章浏览阅读1.6k次。Markdown 文本换行_markdowntext 换行

错误:0xC0000022 在运行 Microsoft Windows 非核心版本的计算机上,运行”slui.exe 0x2a 0xC0000022″以显示错误文本_错误: 0xc0000022 在运行 microsoft windows 非核心版本的计算机上,运行-程序员宅基地

文章浏览阅读6.7w次,点赞2次,收藏37次。win10 2016长期服务版激活错误解决方法:打开“注册表编辑器”;(Windows + R然后输入Regedit)修改SkipRearm的值为1:(在HKEY_LOCAL_MACHINE–》SOFTWARE–》Microsoft–》Windows NT–》CurrentVersion–》SoftwareProtectionPlatform里面,将SkipRearm的值修改为1)重..._错误: 0xc0000022 在运行 microsoft windows 非核心版本的计算机上,运行“slui.ex