在C语言中进行数据库的增删改查操作,通常需要借助数据库提供的API或者库函数,这里以MySQL数据库为例,介绍如何在C语言中连接MySQL数据库并进行增删改查操作。
安装MySQL数据库:确保你的系统中已经安装了MySQL数据库,并且能够正常启动和运行。
创建数据库和表:为了演示,我们需要一个名为test_db
的数据库和一个名为users
的表,可以使用以下SQL语句创建它们:
CREATE DATABASE test_db; USE test_db; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, age INT NOT NULL );
安装MySQL C API库:在你的C开发环境中,需要安装MySQL的C API库(通常是libmysqlclient),在Ubuntu系统上,可以使用以下命令安装:
sudo apt-get install libmysqlclient-dev
以下是一个完整的示例程序,展示了如何在C语言中连接到MySQL数据库,并执行增删改查操作。
#include <stdio.h> #include <stdlib.h> #include <mysql/mysql.h> // 数据库配置信息 #define DB_HOST "localhost" #define DB_USER "root" #define DB_PASS "your_password" #define DB_NAME "test_db" // 初始化数据库连接 MYSQL init_db() { MYSQL conn = mysql_init(NULL); if (conn == NULL) { fprintf(stderr, "%s ", mysql_error(conn)); exit(1); } if (mysql_real_connect(conn, DB_HOST, DB_USER, DB_PASS, DB_NAME, 0, NULL, 0) == NULL) { fprintf(stderr, "%s ", mysql_error(conn)); mysql_close(conn); exit(1); } return conn; } // 插入数据 void insert_user(MYSQL conn, const char name, int age) { char query[256]; sprintf(query, "INSERT INTO users (name, age) VALUES ('%s', %d)", name, age); if (mysql_query(conn, query)) { fprintf(stderr, "%s ", mysql_error(conn)); } else { printf("Inserted user: %s, %d ", name, age); } } // 删除数据 void delete_user(MYSQL conn, int id) { char query[256]; sprintf(query, "DELETE FROM users WHERE id = %d", id); if (mysql_query(conn, query)) { fprintf(stderr, "%s ", mysql_error(conn)); } else { printf("Deleted user with ID: %d ", id); } } // 更新数据 void update_user(MYSQL conn, int id, const char name, int age) { char query[256]; sprintf(query, "UPDATE users SET name = '%s', age = %d WHERE id = %d", name, age, id); if (mysql_query(conn, query)) { fprintf(stderr, "%s ", mysql_error(conn)); } else { printf("Updated user with ID: %d ", id); } } // 查询数据 void select_users(MYSQL conn) { if (mysql_query(conn, "SELECT FROM users")) { fprintf(stderr, "%s ", mysql_error(conn)); return; } MYSQL_RES result = mysql_store_result(conn); if (result == NULL) { fprintf(stderr, "%s ", mysql_error(conn)); return; } MYSQL_ROW row; while ((row = mysql_fetch_row(result))) { printf("ID: %s, Name: %s, Age: %s ", row[0], row[1], row[2]); } mysql_free_result(result); } int main() { MYSQL conn = init_db(); // 插入数据示例 insert_user(conn, "Alice", 30); insert_user(conn, "Bob", 25); // 查询数据示例 printf("All users: "); select_users(conn); // 更新数据示例 update_user(conn, 1, "Alice Smith", 31); // 再次查询数据示例 printf("After update: "); select_users(conn); // 删除数据示例 delete_user(conn, 2); // 最终查询数据示例 printf("After deletion: "); select_users(conn); mysql_close(conn); return 0; }
将上述代码保存为db_operations.c
,然后使用以下命令编译和运行:
gcc db_operations.c -o db_operations -lmysqlclient ./db_operations
假设你按照上述步骤操作,程序的输出可能如下:
Inserted user: Alice, 30 Inserted user: Bob, 25 All users: ID: 1, Name: Alice, Age: 30 ID: 2, Name: Bob, Age: 25 Updated user with ID: 1 After update: ID: 1, Name: Alice Smith, Age: 31 ID: 2, Name: Bob, Age: 25 Deleted user with ID: 2 After deletion: ID: 1, Name: Alice Smith, Age: 31
Q1: 如果连接数据库失败,应该如何排查问题?
A1: 如果连接数据库失败,可以检查以下几点:
确保MySQL服务器正在运行,并且可以通过mysql -u root -p
命令登录。
检查数据库主机名、用户名、密码和数据库名称是否正确。
确保防火墙没有阻止连接。
查看错误信息,使用mysql_error(conn)
获取详细的错误描述。
Q2: 如何防止SQL注入攻击?
A2: 为了防止SQL注入攻击,建议使用预处理语句(Prepared Statements)而不是直接拼接SQL字符串,虽然上面的示例代码为了简单直接使用了sprintf
,但在实际应用中,应该使用类似以下的方式:
MYSQL_STMT stmt; stmt = mysql_stmt_init(conn); if (!stmt) { fprintf(stderr, "mysql_stmt_init failed "); exit(1); } if (mysql_stmt_prepare(stmt, "INSERT INTO users (name, age) VALUES (?, ?)", -1)) { fprintf(stderr, "%s ", mysql_error(conn)); mysql_stmt_close(stmt); exit(1); } MYSQL_BIND bind[2]; bind[0].buffer_type = MYSQL_TYPE_STRING; bind[0].buffer = (char )name; bind[0].buffer_length = strlen(name); bind[1].buffer_type = MYSQL_TYPE_LONG; bind[1].buffer = &age; bind[1].is_null = 0; if (mysql_stmt_bind_param(stmt, bind)) { fprintf(stderr, "%s ", mysql_error(conn)); mysql_stmt_close(stmt); exit(1); } if (mysql_stmt_execute(stmt)) { fprintf(stderr, "%s ", mysql_error(conn)); mysql_stmt_close(stmt); exit(1); } mysql_stmt_close(stmt);