使用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
)。
- MySQL:使用MySQL C API(如
- 通用数据库接口
- ODBC:通过
odbc.h
和sql.h
实现跨数据库连接。 - SQLAPI++:第三方C++库,支持多种数据库。
- ODBC:通过
环境配置与初始化
- 安装数据库驱动
- MySQL示例:下载并安装
MySQL Connector/C
,确保动态库(如libmysql.dll
)在系统路径中。 - ODBC示例:配置ODBC数据源(DSN),如通过Windows的“ODBC数据源管理器”添加数据库连接信息。
- MySQL示例:下载并安装
- 包含头文件
// 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:通过
mysql_error(conn)
获取错误信息。 - ODBC:调用
SQLGetDiagRec()
获取诊断记录。
- MySQL:通过
不同数据库访问方式对比
特性 | 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()
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/68477.html