080. 使用C语言实现简单的数据库操作

在C语言中,实现简单的数据库操作通常涉及使用SQL语句与数据库进行交互。虽然C语言本身不直接支持数据库操作,但可以通过数据库的API或第三方库来实现。常见的数据库包括SQLite、MySQL和PostgreSQL等。
在C语言中,数据库操作可以通过多种方式实现,以下是常见的几种方法:

使用原生API

部分数据库如SQLite、MySQL等提供原生C语言API。SQLite是嵌入式数据库,无需额外服务器,适合轻量级应用。

#include <sqlite3.h>
sqlite3 *db;
sqlite3_open("test.db", &db);
sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY, name TEXT);", 0, 0, 0);
sqlite3_close(db);

ODBC接口

ODBC(Open Database Connectivity)是跨平台的数据库访问标准,适用于多种数据库系统。

#include <sql.h>
#include <sqlext.h>
SQLHENV env;
SQLHDBC dbc;
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
SQLConnect(dbc, "DSN=your_dsn_name", SQL_NTS, NULL, 0, NULL, 0);

第三方库

如libpq(PostgreSQL)、MySQL Connector/C等,提供针对特定数据库的优化接口。
PostgreSQL示例:

#include <libpq-fe.h>
PGconn *conn = PQconnectdb("user=postgres dbname=test");
PGresult *res = PQexec(conn, "SELECT * FROM users");
int rows = PQntuples(res);
PQclear(res);
PQfinish(conn);

ORM框架

虽然C语言缺乏成熟的ORM,但可借助像SQLPP11等库实现对象关系映射。需结合C++使用。

文件模拟

对于简单需求,可直接操作文件模拟数据库行为:

FILE *fp = fopen("data.dat", "ab+");
fprintf(fp, "%d,%s\n", 1, "John");
fclose(fp);

选择方案时应考虑:

  • SQLite适合嵌入式场景
  • ODBC适合需要跨数据库兼容性
  • 原生API通常性能最优
  • 第三方库提供更多数据库特定功能

SQLite是一个轻量级的嵌入式数据库,非常适合小型项目和学习用途。

1. 安装SQLite

在Linux上,可以通过包管理器安装SQLite。例如,在Ubuntu上,可以使用以下命令安装SQLite开发库:

sudo apt-get install sqlite3 libsqlite3-dev

在Windows上,可以从SQLite官网下载预编译的二进制文件,并将其添加到系统的PATH中。

2. 示例代码:使用SQLite创建数据库、表和插入数据

#include <stdio.h>
#include <sqlite3.h>

// 回调函数:用于处理查询结果
static int callback(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;
}

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));
        sqlite3_close(db);
        return 1;
    } else {
        fprintf(stderr, "Opened database successfully\n");
    }

    // 创建表
    const char* createTableSQL = "CREATE TABLE IF NOT EXISTS COMPANY("
                                 "ID INT PRIMARY KEY NOT NULL,"
                                 "NAME TEXT NOT NULL,"
                                 "AGE INT NOT NULL,"
                                 "ADDRESS CHAR(50),"
                                 "SALARY REAL );";
    rc = sqlite3_exec(db, createTableSQL, 0, 0, &zErrMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    } else {
        fprintf(stdout, "Table created successfully\n");
    }

    // 插入数据
    const char* insertSQL = "INSERT INTO COMPANY (ID, NAME, AGE, ADDRESS, SALARY) "
                            "VALUES (1, 'Paul', 32, 'California', 20000.00 );";
    rc = sqlite3_exec(db, insertSQL, 0, 0, &zErrMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    } else {
        fprintf(stdout, "Records created successfully\n");
    }

    // 查询数据
    const char* selectSQL = "SELECT * FROM COMPANY;";
    rc = sqlite3_exec(db, selectSQL, callback, 0, &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;
}

3. 编译和运行

在Linux上,可以使用以下命令编译和运行程序:

gcc -o sqlite_example sqlite_example.c -lsqlite3
./sqlite_example

在Windows上,需要确保SQLite的动态链接库(DLL)在系统的PATH中,或者将DLL文件放在与可执行文件相同的目录下。

4. 示例运行

运行程序后,会创建一个名为test.db的数据库文件,并在其中创建一个COMPANY表,插入一条记录,并查询显示所有记录。

输出:
Opened database successfully
Table created successfully
Records created successfully
ID = 1
NAME = Paul
AGE = 32
ADDRESS = California
SALARY = 20000.0

Operation done successfully

5. 注意事项

  1. 数据库文件:SQLite数据库是一个单一的文件,通常以.db为扩展名。如果文件不存在,sqlite3_open会自动创建它。
  2. SQL语句:使用sqlite3_exec函数执行SQL语句。该函数可以执行创建表、插入数据、查询数据等操作。
  3. 回调函数:查询结果通过回调函数处理。回调函数的参数包括查询结果的列名和列值。
  4. 错误处理:使用sqlite3_errmsg获取错误信息,并使用sqlite3_free释放错误信息的内存。
  5. 关闭数据库:使用sqlite3_close关闭数据库连接,确保释放所有资源。

6. 总结

通过使用SQLite,可以在C语言中实现简单的数据库操作。SQLite是一个轻量级的嵌入式数据库,适用于小型项目和学习用途。通过掌握SQLite的基本操作,可以实现数据的存储、查询和管理。在实际开发中,可以根据具体需求选择合适的数据库系统。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐