在C语言中连接SQL数据库通常需要借助特定的数据库API或第三方库,因为C语言本身不提供内置的数据库连接功能,以下是使用不同数据库连接方式的代码示例和详细说明,帮助开发者快速上手。

连接MySQL数据库
MySQL提供了C语言的官方连接库mysqlclient,首先需要安装MySQL开发库,然后在代码中包含头文件并初始化连接,以下是基本步骤:
#include <mysql/mysql.h>
#include <stdio.h>
int main() {
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
conn = mysql_init(NULL);
if (conn == NULL) {
fprintf(stderr, "mysql_init() failedn");
return 1;
}
if (mysql_real_connect(conn, "localhost", "user", "password", "database", 0, NULL, 0) == NULL) {
fprintf(stderr, "mysql_real_connect() failed: %sn", mysql_error(conn));
mysql_close(conn);
return 1;
}
if (mysql_query(conn, "SELECT * FROM users")) {
fprintf(stderr, "mysql_query() failed: %sn", mysql_error(conn));
mysql_close(conn);
return 1;
}
res = mysql_store_result(conn);
if (res == NULL) {
fprintf(stderr, "mysql_store_result() failedn");
mysql_close(conn);
return 1;
}
while ((row = mysql_fetch_row(res)) != NULL) {
printf("%s %sn", row[0], row[1]);
}
mysql_free_result(res);
mysql_close(conn);
return 0;
} 编译时需链接MySQL库:gcc -o mysql_example mysql_example.c -lmysqlclient。
连接SQLite数据库
SQLite是一个轻量级嵌入式数据库,其C语言API直接集成在库中,无需额外安装,只需包含sqlite3.h头文件:

#include <sqlite3.h>
#include <stdio.h>
int main() {
sqlite3 *db;
char *errMsg = NULL;
int rc;
rc = sqlite3_open("test.db", &db);
if (rc != SQLITE_OK) {
fprintf(stderr, "Cannot open database: %sn", sqlite3_errmsg(db));
return 1;
}
rc = sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS users (id INTEGER, name TEXT)", NULL, NULL, &errMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %sn", errMsg);
sqlite3_free(errMsg);
sqlite3_close(db);
return 1;
}
rc = sqlite3_exec(db, "INSERT INTO users VALUES (1, 'Alice')", NULL, NULL, &errMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %sn", errMsg);
sqlite3_free(errMsg);
}
sqlite3_close(db);
return 0;
} 编译命令:gcc -o sqlite_example sqlite_example.c -lsqlite3。
连接PostgreSQL数据库
PostgreSQL的C语言接口为libpq,需安装开发包并包含libpq-fe.h:
#include <libpq-fe.h>
#include <stdio.h>
int main() {
PGconn *conn;
PGresult *res;
conn = PQconnectdb("dbname=test user=postgres password=secret");
if (PQstatus(conn) != CONNECTION_OK) {
fprintf(stderr, "Connection to database failed: %sn", PQerrorMessage(conn));
PQfinish(conn);
return 1;
}
res = PQexec(conn, "SELECT * FROM users");
if (PQresultStatus(res) != PGRES_TUPLES_OK) {
fprintf(stderr, "Query failed: %sn", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
return 1;
}
for (int i = 0; i < PQntuples(res); i++) {
printf("%s %sn", PQgetvalue(res, i, 0), PQgetvalue(res, i, 1));
}
PQclear(res);
PQfinish(conn);
return 0;
} 编译命令:gcc -o pg_example pg_example.c -lpq。

通用注意事项
- 错误处理:所有数据库操作都应检查返回值,确保连接和查询成功。
- 资源释放:及时释放结果集、关闭连接,避免内存泄漏。
- 安全性:避免SQL注入,使用参数化查询或转义用户输入。
- 线程安全:多数数据库库需要额外配置以支持多线程环境。
相关问答FAQs
Q1: 如何处理C语言连接数据库时的中文乱码问题?
A1: 乱码通常是由于字符集不匹配导致的,需确保数据库、表、字段和连接的字符集一致,在MySQL中,连接时可指定字符集:mysql_real_connect(conn, "localhost", "user", "password", "database", 0, NULL, CLIENT_MULTI_STATEMENTS | CLIENT_MULTI_RESULTS),并在创建表时指定utf8mb4字符集。
Q2: C语言连接数据库时如何实现连接池?
A2: C语言本身不提供连接池,但可以通过第三方库(如libpqxx for PostgreSQL)或自定义实现,基本思路是维护一个连接队列,初始化时创建多个连接,使用时从队列获取,用完后归还,需注意线程安全和连接有效性检查。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复