C语言实例_调用SQLITE数据库完成数据增删改查

一、SQLite介绍

SQLite是一种轻量级的关系型数据库管理系统(RDBMS),它是一个开源的、零配置的、服务器端的、自包含的、零管理的、事务性的SQL数据库引擎。它被广泛应用于嵌入式设备、移动设备和桌面应用程序等领域。

SQLite的特点包括:

(1)轻量级:SQLite的核心库只有几百KB,非常适合在嵌入式设备、移动设备等资源受限的环境中使用。

(2)零配置:SQLite不需要任何配置,只需要将库文件嵌入到应用程序中即可。

(3)服务器端:SQLite不需要运行在服务器上,所有的数据都存储在本地文件中。

(4)自包含:SQLite的所有功能都包含在一个单独的库文件中,不需要依赖其他库文件。

(5)零管理:SQLite不需要维护数据库的连接、事务等状态,所有的操作都是自动的。

(6)事务性:SQLite支持ACID事务,保证数据的一致性和可靠性。

SQLite支持标准的SQL语句,包括SELECT、INSERT、UPDATE、DELETE等操作,同时还支持多种数据类型,包括整数、浮点数、字符串、日期等。SQLite还支持多种编程语言,包括C、C++、Python、Java等,可以方便地集成到各种应用程序中。

在 Windows 系统下,可以按照以下步骤下载和安装 SQLite 数据库:

(1)打开 SQLite 官方网站:www.sqlite.org/index.html

(2)在网站顶部的菜单栏中,点击 "Downloads" 进入下载页面。

(3)在下载页面中,你会看到一些可用的预编译二进制文件。根据你的 Windows 操作系统位数(32位或64位)和需求选择适当的版本。

(4)对于 32 位系统,可以在 "Precompiled Binaries for Windows" 部分直接下载 sqlite-dll-win32-x86-*.zipsqlite-tools-win32-x86-*.zip 文件。

(5)对于 64 位系统,可以在 "Precompiled Binaries for Windows" 部分直接下载 sqlite-dll-win64-x64-*.zipsqlite-tools-win64-x64-*.zip 文件。

(6)下载完成后,解压缩 sqlite-dll-win*.zip 文件得到 sqlite3.dll 文件。

(7)创建一个文件夹(命名为 SQLite 或其他喜欢的名称),将 sqlite3.dll 文件拷贝到该文件夹中。

(8)接下来,解压缩 sqlite-tools-win*.zip 文件得到一组工具文件,包括 sqlite3.exesqlite3_analyzer.exesqlite3.def 文件。

(8)将这些工具文件也拷贝到之前创建的 SQLite 文件夹中。

二、SQLite语法

SQLite是一个轻量级的嵌入式数据库,支持标准SQL语法。

下面逐一介绍SQLite数据库的创建表、插入数据、删除数据、更新数据和查询数据的语法:

(1)创建表

要在SQLite数据库中创建表,可以使用CREATE TABLE语句。语法如下:

cpp 复制代码
CREATE TABLE table_name (
    column1 datatype constraint,
    column2 datatype constraint,
    ...
);
  • table_name 是所要创建的表的名称。
  • column1, column2等是表的列名。
  • datatype 是列的数据类型。
  • constraint 是可选项,用于定义列约束条件,比如主键、唯一约束、外键等。

例如,创建一个名为 "students" 的表,包含id、name和age三个列:

cpp 复制代码
CREATE TABLE students (
    id INTEGER PRIMARY KEY,
    name TEXT,
    age INTEGER
);

(2)插入数据

要向SQLite数据库中的表插入数据,可以使用INSERT INTO语句。语法如下:

cpp 复制代码
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
  • table_name 是要插入数据的表的名称。
  • column1, column2等是表的列名。
  • value1, value2等是要插入的具体数值。

例如,向 "students" 表中插入一条数据:

cpp 复制代码
INSERT INTO students (id, name, age)
VALUES (1, '张三', 20);

(3)删除数据

要从SQLite数据库中的表删除数据,可以使用DELETE FROM语句。语法如下:

cpp 复制代码
DELETE FROM table_name
WHERE condition;
  • table_name 是要删除数据的表的名称。
  • condition 是可选项,用于指定删除数据的条件。

例如,从 "students" 表中删除 id 为 1 的数据:

cpp 复制代码
DELETE FROM students
WHERE id = 1;

(4)更新数据

要更新SQLite数据库表中的数据,可以使用UPDATE语句。语法如下:

cpp 复制代码
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
  • table_name 是要更新数据的表的名称。
  • column1, column2等是要更新的列名。
  • value1, value2等是要更新的具体数值。
  • condition 是可选项,用于指定更新数据的条件。

例如,将 "students" 表中 id 为 1 的数据的 name 更新为 '李四',age 更新为 22:

cpp 复制代码
UPDATE students
SET name = '李四', age = 22
WHERE id = 1;

(5)查询数据

要从SQLite数据库表中查询数据,可以使用SELECT语句。语法如下:

cpp 复制代码
SELECT column1, column2, ...
FROM table_name
WHERE condition;
  • column1, column2等是要查询的列名,如果要查询所有列,可以使用 * 符号代替。
  • table_name 是要查询数据的表的名称。
  • condition 是可选项,用于指定查询数据的条件。

例如,从 "students" 表中查询所有数据:

cpp 复制代码
SELECT * FROM students;

三、完整代码

下面C语言代码,演示如何使用SQLite数据库:

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

// 数据库文件名
const char* DB_FILE = "example.db";

// 回调函数,用于执行查询sql语句后的结果处理
int selectCallback(void* data, 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;
}

// 初始化数据库连接
sqlite3* initDatabase()
{
    sqlite3* db;
    
    int rc = sqlite3_open(DB_FILE, &db);
    if (rc != SQLITE_OK)
    {
        fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return NULL;
    }
    
    return db;
}

// 关闭数据库连接
void closeDatabase(sqlite3* db)
{
    if (db)
    {
        sqlite3_close(db);
    }
}

// 创建表
void createTable(sqlite3* db)
{
    char* errMsg;
    const char* createSql = "CREATE TABLE IF NOT EXISTS students (id INT PRIMARY KEY, name TEXT, age INT);";
    
    int rc = sqlite3_exec(db, createSql, NULL, 0, &errMsg);
    if (rc != SQLITE_OK)
    {
        fprintf(stderr, "无法创建表: %s\n", errMsg);
        sqlite3_free(errMsg);
    }
    else
    {
        printf("表创建成功\n");
    }
}

// 插入数据
void insertData(sqlite3* db, int id, const char* name, int age)
{
    char insertSql[100];
    snprintf(insertSql, sizeof(insertSql), "INSERT INTO students (id, name, age) VALUES (%d, '%s', %d);", id, name, age);
    
    char* errMsg;
    int rc = sqlite3_exec(db, insertSql, NULL, 0, &errMsg);
    if (rc != SQLITE_OK)
    {
        fprintf(stderr, "无法插入数据: %s\n", errMsg);
        sqlite3_free(errMsg);
    }
    else
    {
        printf("数据插入成功\n");
    }
}

// 更新数据
void updateData(sqlite3* db, int id, const char* name, int age)
{
    char updateSql[100];
    snprintf(updateSql, sizeof(updateSql), "UPDATE students SET name = '%s', age = %d WHERE id = %d;", name, age, id);
    
    char* errMsg;
    int rc = sqlite3_exec(db, updateSql, NULL, 0, &errMsg);
    if (rc != SQLITE_OK)
    {
        fprintf(stderr, "无法更新数据: %s\n", errMsg);
        sqlite3_free(errMsg);
    }
    else
    {
        printf("数据更新成功\n");
    }
}

// 删除数据
void deleteData(sqlite3* db, int id)
{
    char deleteSql[100];
    snprintf(deleteSql, sizeof(deleteSql), "DELETE FROM students WHERE id = %d;", id);
    
    char* errMsg;
    int rc = sqlite3_exec(db, deleteSql, NULL, 0, &errMsg);
    if (rc != SQLITE_OK)
    {
        fprintf(stderr, "无法删除数据: %s\n", errMsg);
        sqlite3_free(errMsg);
    }
    else
    {
        printf("数据删除成功\n");
    }
}

// 查询数据
void selectData(sqlite3* db)
{
    char* errMsg;
    const char* selectSql = "SELECT * FROM students;";
    
    int rc = sqlite3_exec(db, selectSql, selectCallback, 0, &errMsg);
    if (rc != SQLITE_OK)
    {
        fprintf(stderr, "无法查询数据: %s\n", errMsg);
        sqlite3_free(errMsg);
    }
}

int main()
{
    sqlite3* db = initDatabase();
    
    if (db)
    {
        createTable(db);
        
        insertData(db, 1, "张三", 20);
        insertData(db, 2, "李四", 22);
        insertData(db, 3, "王五", 25);
        
        selectData(db);
        
        updateData(db, 1, "赵六", 23);
        
        selectData(db);
        
        deleteData(db, 3);
        
        selectData(db);
        
        closeDatabase(db);
    }
    
    return 0;
}

在这个示例中,通过 initDatabase 函数初始化数据库连接,通过 createTable 函数创建一个名为 "students" 的表。然后使用 insertData 函数插入数据,updateData 函数更新数据,deleteData 函数删除数据,selectData 函数查询数据,并通过 selectCallback 回调函数处理查询结果。

相关推荐
潘多编程19 分钟前
Spring Boot微服务架构设计与实战
spring boot·后端·微服务
2402_8575893624 分钟前
新闻推荐系统:Spring Boot框架详解
java·spring boot·后端
2401_8576226625 分钟前
新闻推荐系统:Spring Boot的可扩展性
java·spring boot·后端
Amagi.2 小时前
Spring中Bean的作用域
java·后端·spring
2402_857589362 小时前
Spring Boot新闻推荐系统设计与实现
java·spring boot·后端
J老熊2 小时前
Spring Cloud Netflix Eureka 注册中心讲解和案例示范
java·后端·spring·spring cloud·面试·eureka·系统架构
Benaso2 小时前
Rust 快速入门(一)
开发语言·后端·rust
sco52822 小时前
SpringBoot 集成 Ehcache 实现本地缓存
java·spring boot·后端
原机小子3 小时前
在线教育的未来:SpringBoot技术实现
java·spring boot·后端
吾日三省吾码3 小时前
详解JVM类加载机制
后端