C语言如何连接数据库

在C语言中调用数据库通常通过数据库提供的API接口实现,例如MySQL的C API或SQLite的嵌入式库,基本流程包含:引入头文件、建立数据库连接、执行SQL查询语句、处理返回结果集,最后关闭连接释放资源,ODBC或第三方库如libpq(PostgreSQL)也是常见方案。

核心步骤

  1. 安装数据库和开发库

    C语言如何连接数据库

    • 数据库服务端:如MySQL、PostgreSQL、SQLite等。
    • C语言开发库:
      • MySQL: libmysqlclient-dev (Linux) 或 Connector/C (Windows)
      • SQLite: libsqlite3-dev
      • PostgreSQL: libpq-dev
        安装命令示例(Ubuntu):

        sudo apt-get install libmysqlclient-dev  # MySQL
        sudo apt-get install libsqlite3-dev      # SQLite
  2. 包含头文件
    在C代码中引入数据库头文件:

    #include <mysql/mysql.h>  // MySQL
    #include <sqlite3.h>      // SQLite
    #include <libpq-fe.h>     // PostgreSQL
  3. 关键操作流程

    graph LR
    A[初始化连接对象] --> B[连接数据库]
    B --> C[执行SQL语句]
    C --> D[处理结果集]
    D --> E[释放资源]

MySQL调用示例

#include <mysql/mysql.h>
#include <stdio.h>
int main() {
    MYSQL *conn;          // 数据库连接对象
    MYSQL_RES *res;       // 结果集
    MYSQL_ROW row;        // 行数据
    // 1. 初始化连接
    conn = mysql_init(NULL);
    if (conn == NULL) {
        fprintf(stderr, "初始化失败: %sn", mysql_error(conn));
        return 1;
    }
    // 2. 连接数据库
    if (mysql_real_connect(
        conn,                 // 连接对象
        "localhost",          // 主机名
        "username",           // 用户名
        "password",           // 密码
        "testdb",             // 数据库名
        3306,                 // 端口(默认3306)
        NULL,                 // Unix Socket(通常为NULL)
        0                     // 客户端标志
    ) == NULL) {
        fprintf(stderr, "连接失败: %sn", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }
    // 3. 执行SQL查询
    if (mysql_query(conn, "SELECT id, name FROM users")) {
        fprintf(stderr, "查询失败: %sn", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }
    // 4. 获取结果集
    res = mysql_store_result(conn);
    if (res == NULL) {
        fprintf(stderr, "获取结果失败: %sn", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }
    // 5. 遍历结果
    while ((row = mysql_fetch_row(res)) != NULL) {
        printf("ID: %s, Name: %sn", row[0], row[1]);  // 按列索引访问
    }
    // 6. 释放资源
    mysql_free_result(res);  // 释放结果集
    mysql_close(conn);       // 关闭连接
    return 0;
}

其他数据库适配

  1. SQLite

    #include <sqlite3.h>
    int main() {
        sqlite3 *db;
        char *err_msg = NULL;
        // 打开数据库
        if (sqlite3_open("test.db", &db) != SQLITE_OK) {
            fprintf(stderr, "无法打开数据库: %sn", sqlite3_errmsg(db));
            return 1;
        }
        // 执行SQL
        if (sqlite3_exec(db, "SELECT * FROM users;", callback, 0, &err_msg) != SQLITE_OK) {
            fprintf(stderr, "SQL错误: %sn", err_msg);
            sqlite3_free(err_msg);
        }
        sqlite3_close(db);
        return 0;
    }
  2. PostgreSQL

    C语言如何连接数据库

    #include <libpq-fe.h>
    int main() {
        PGconn *conn = PQconnectdb("user=username dbname=testdb");
        if (PQstatus(conn) != CONNECTION_OK) {
            fprintf(stderr, "连接失败: %s", PQerrorMessage(conn));
            PQfinish(conn);
            return 1;
        }
        PGresult *res = PQexec(conn, "SELECT * FROM users;");
        if (PQresultStatus(res) != PGRES_TUPLES_OK) {
            fprintf(stderr, "查询失败: %s", PQerrorMessage(conn));
            PQclear(res);
            PQfinish(conn);
            return 1;
        }
        for (int i = 0; i < PQntuples(res); i++) {
            printf("ID: %s, Name: %sn", PQgetvalue(res, i, 0), PQgetvalue(res, i, 1));
        }
        PQclear(res);
        PQfinish(conn);
        return 0;
    }

关键注意事项

  1. 错误处理
    每次数据库操作后检查错误码(如MySQL的mysql_error()、SQLite的sqlite3_errmsg())。

  2. 防止SQL注入
    使用参数化查询(Prepared Statements):

    // MySQL示例
    MYSQL_STMT *stmt = mysql_stmt_init(conn);
    const char *query = "INSERT INTO users (name) VALUES (?)";
    mysql_stmt_prepare(stmt, query, strlen(query));
    char name[50] = "Safe Name";
    MYSQL_BIND param;
    memset(&param, 0, sizeof(param));
    param.buffer_type = MYSQL_TYPE_STRING;
    param.buffer = name;
    param.buffer_length = strlen(name);
    mysql_stmt_bind_param(stmt, &param);
    mysql_stmt_execute(stmt);
  3. 资源释放
    必须释放结果集(mysql_free_result())和关闭连接(mysql_close()),避免内存泄漏。

  4. 跨平台编译
    Linux链接库:

    C语言如何连接数据库

    gcc program.c -o output -lmysqlclient  # MySQL
    gcc program.c -o output -lsqlite3      # SQLite

    Windows需在IDE中配置库路径(如MySQL Connector/C的.lib文件)。


应用场景建议

  • 嵌入式系统:SQLite(轻量级,无服务端)。
  • 高性能服务:MySQL/PostgreSQL(支持并发和复杂查询)。
  • 实时数据处理:结合连接池(如libzdb)提升效率。

引用说明

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/28333.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年6月17日 16:18
下一篇 2025年6月7日 11:15

相关推荐

  • VS2010怎么连数据库

    在VS2010中使用ADO.NET连接数据库:引用System.Data.SqlClient命名空间,创建SqlConnection对象,提供包含服务器地址、数据库名、认证信息的连接字符串,最后调用Open()方法开启连接即可。

    2025年6月6日
    100
  • VS2015如何添加数据库?

    在Visual Studio 2015中,通过“服务器资源管理器”窗口添加数据库连接,右键单击“数据连接”,选择“添加连接”,然后配置数据库类型(如SQL Server)、服务器名、身份验证和数据库名称即可。

    2025年6月13日
    300
  • 如何快速设计数据库模板?

    数据库设计模板包括需求分析、概念模型(ER图)、逻辑模型(关系模式)、物理模型(表结构)设计,遵循范式规范定义字段、主外键约束,确保数据完整性、一致性和高效访问。

    2025年6月3日
    300
  • 如何在VS2010中实现Oracle数据库连接?

    在Visual Studio 2010中连接Oracle数据库,需先安装ODAC组件并配置TNS,项目中添加Oracle.DataAccess.dll引用,通过OracleConnection类设置连接字符串(含主机、端口、服务名、用户名及密码),使用Open()方法建立连接后即可执行SQL操作。

    2025年5月29日
    200
  • 如何快速检测数据库表是否被锁?

    要判断数据库表是否被锁定,可查看数据库系统提供的锁信息表或使用管理工具(如MySQL的SHOW OPEN TABLES,Oracle查询V$LOCKED_OBJECT),若存在长时间未提交的事务、查询阻塞或超时现象,结合相关锁记录即可确认锁表状态。

    2025年5月28日
    200

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN