连接数据库的基本步骤
在使用C语言进行数据库查询时,首先需要建立与数据库的连接,这一过程通常涉及加载驱动、创建连接对象、设置连接参数等步骤,以MySQL数据库为例,需先安装MySQL C Connector(libmysqlclient),并包含对应的头文件,通过mysql_init()初始化连接句柄,再使用mysql_real_connect()函数指定主机、用户名、密码和数据库名等信息,连接成功后,即可执行SQL查询操作。

执行SQL查询的方法
连接数据库后,可通过mysql_query()函数执行SQL语句,该函数接受一个以NULL结尾的字符串参数,表示要执行的SQL命令,执行SELECT * FROM users;查询时,需确保语句格式正确,避免语法错误,查询执行后,需使用mysql_store_result()或mysql_use_result()获取结果集,前者将结果完整存储在内存中,适合小数据量;后者则逐行读取,适合大数据量以减少内存占用。
处理查询结果
获取结果集后,需遍历并处理数据,通过mysql_num_fields()获取字段数量,mysql_fetch_row()逐行读取数据,每行数据以字符串数组形式返回,可通过索引访问各字段值。result->data[0]表示第一列的数据,需注意数据类型的转换,如将字符串转换为整数或浮点数时,使用atoi()或atof()函数,处理完毕后,调用mysql_free_result()释放结果集资源。
错误处理与资源释放
数据库操作中,错误处理至关重要,每次调用MySQL函数后,应检查返回值是否成功。mysql_query()返回0表示成功,否则可通过mysql_error()获取错误信息,需确保在程序结束时关闭连接,通过mysql_close()释放连接句柄,避免资源泄漏,特别是在循环或异常处理中,需确保mysql_free_result()和mysql_close()被正确执行。

完整代码示例
以下是一个简化的MySQL查询示例:
#include <mysql/mysql.h>
#include <stdio.h>
int main() {
MYSQL *conn;
MYSQL_RES *result;
MYSQL_ROW row;
conn = mysql_init(NULL);
if (mysql_real_connect(conn, "localhost", "user", "password", "database", 0, NULL, 0) == NULL) {
fprintf(stderr, "Connection failed: %sn", mysql_error(conn));
return 1;
}
if (mysql_query(conn, "SELECT name, age FROM users")) {
fprintf(stderr, "Query failed: %sn", mysql_error(conn));
return 1;
}
result = mysql_store_result(conn);
while ((row = mysql_fetch_row(result))) {
printf("Name: %s, Age: %sn", row[0], row[1]);
}
mysql_free_result(result);
mysql_close(conn);
return 0;
} 相关问答FAQs
Q1: 如何处理查询结果中的NULL值?
A1: 在遍历结果集时,需检查mysql_fetch_row()返回的行数据中是否有NULL字段,可通过mysql_fetch_lengths()获取各字段长度,若长度为0则表示该字段为NULL。
while ((row = mysql_fetch_row(result))) {
if (row[0] == NULL) {
printf("Field is NULLn");
} else {
printf("Value: %sn", row[0]);
}
} Q2: 如何防止SQL注入攻击?
A2: 使用预处理语句(Prepared Statements)可有效防止SQL注入,通过mysql_stmt_prepare()、mysql_stmt_bind_param()和mysql_stmt_execute()等函数,将参数与SQL语句分离处理。

MYSQL_STMT *stmt = mysql_stmt_init(conn); mysql_stmt_prepare(stmt, "SELECT * FROM users WHERE name = ?", 33); MYSQL_BIND bind[1]; memset(bind, 0, sizeof(bind)); char name[] = "John"; bind[0].buffer_type = MYSQL_TYPE_STRING; bind[0].buffer = name; bind[0].buffer_length = strlen(name); mysql_stmt_bind_param(stmt, bind); mysql_stmt_execute(stmt);
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复