当前位置:首页 > 数据库 > 正文

C语言如何连接数据库

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

核心步骤

  1. 安装数据库和开发库

    • 数据库服务端:如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代码中引入数据库头文件:

    C语言如何连接数据库 第1张

    #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语言如何连接数据库 第2张

    #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):

    C语言如何连接数据库 第3张

    // 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链接库:

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

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


应用场景建议

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


引用说明

0