上一篇
c 怎么读取sql数据库数据
- 数据库
- 2025-07-19
- 8
使用C语言对应数据库API(如MySQL C API),先建立连接,执行SELECT查询,遍历结果集处理数据,操作完成后关闭
在C语言中读取SQL数据库数据需要依赖数据库访问库或驱动程序,通过编程接口实现与数据库的通信,以下是详细的实现步骤和注意事项:


选择数据库访问方式
C语言本身不具备直接操作SQL数据库的能力,需通过以下方式实现:

- 专用数据库库
- MySQL:使用MySQL C API(如mysql.h)。
- SQLite:使用SQLite3库(如sqlite3.h)。
- PostgreSQL:使用libpq库(如libpq-fe.h)。
- 通用数据库接口
- ODBC:通过odbc.h和sql.h实现跨数据库连接。
- SQLAPI++:第三方C++库,支持多种数据库。
环境配置与初始化
- 安装数据库驱动
- MySQL示例:下载并安装MySQL Connector/C,确保动态库(如libmysql.dll)在系统路径中。
- ODBC示例:配置ODBC数据源(DSN),如通过Windows的“ODBC数据源管理器”添加数据库连接信息。
- 包含头文件 // MySQL示例 #include <mysql.h> #include <stdio.h> #include <stdlib.h>
建立数据库连接
- MySQL专用库连接 MYSQL conn = mysql_init(NULL); // 初始化连接对象 if (!mysql_real_connect(conn, "localhost", "user", "password", "database", 0, NULL, 0)) { fprintf(stderr, "Connection failed: %s ", mysql_error(conn)); exit(EXIT_FAILURE); }
- ODBC通用连接 #include <sql.h> #include <sqlext.h> // 分配环境句柄 SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env); SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void )SQL_OV_ODBC3, 0); // 分配连接句柄 SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc); // 连接数据库 SQLConnect(dbc, (SQLCHAR )"DSN_NAME", SQL_NTS, NULL, 0, NULL, 0);
执行SQL查询
- 构建查询语句 // MySQL示例:查询所有数据 char query[] = "SELECT id, name, age FROM users"; if (mysql_query(conn, query)) { fprintf(stderr, "Query failed: %s ", mysql_error(conn)); mysql_close(conn); exit(EXIT_FAILURE); }
- ODBC示例 SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); SQLExecDirect(stmt, (SQLCHAR )"SELECT id, name, age FROM users", SQL_NTS);
处理查询结果
- MySQL结果集处理 MYSQL_RES result = mysql_store_result(conn); // 获取结果集 if (result == NULL) { fprintf(stderr, "Result fetching failed: %s ", mysql_error(conn)); mysql_close(conn); exit(EXIT_FAILURE); } int num_fields = mysql_num_fields(result); // 字段数 MYSQL_ROW row; // 单行数据 while ((row = mysql_fetch_row(result))) { // 遍历每一行 for (int i = 0; i < num_fields; i++) { printf("%st", row[i] ? row[i] : "NULL"); // 输出字段值 } printf(" "); } mysql_free_result(result); // 释放结果集
- ODBC结果集处理 SQLAllocHandle(SQL_HANDLE_DESC, stmt, &desc); // 描述符 while (SQLFetch(stmt) == SQL_SUCCESS) { // 遍历行 SQLCHAR buf[256]; for (int i = 1; i <= num_columns; i++) { SQLGetData(stmt, i, SQL_C_CHAR, buf, sizeof(buf), NULL); printf("%st", buf); } printf(" "); } SQLFreeHandle(SQL_HANDLE_DESC, desc);
资源释放与错误处理
- 关闭连接
- MySQL:mysql_close(conn);
- ODBC:SQLDisconnect(dbc); SQLFreeHandle(SQL_HANDLE_DBC, dbc);
- 错误处理
- MySQL:通过mysql_error(conn)获取错误信息。
- ODBC:调用SQLGetDiagRec()获取诊断记录。
不同数据库访问方式对比
| 特性 | MySQL专用库 | ODBC通用接口 | SQLite3库 |
|---|---|---|---|
| 适用数据库 | MySQL | 多种(需配置DSN) | SQLite |
| 性能 | 高 | 中等 | 高(本地文件) |
| 移植性 | 低 | 高 | 高 |
| 依赖配置 | 需动态库和头文件 | 需ODBC驱动和DSN | 仅静态/动态库 |
| 典型场景 | MySQL服务器应用 | 跨数据库兼容 | 嵌入式数据库 |
FAQs
问题1:为什么连接数据库时提示“Access denied”?
解答:常见原因包括用户名/密码错误、用户权限不足或数据库服务未启动,检查以下内容:
- 确认用户名和密码正确。
- 确保用户有对应数据库的访问权限(如MySQL的GRANT权限)。
- 验证数据库服务是否运行(如systemctl status mysqld)。
问题2:如何替换为其他数据库(如PostgreSQL)?
解答:需更换对应的库和API:
- 安装PostgreSQL的libpq库,包含头文件libpq-fe.h。
- 使用PQconnectdb()替代mysql_real_connect()。
- 调整查询函数(如PQexec())和结果处理逻辑(如`PQgetvalue()