上一篇
调用表格数据库需先连接数据库,再通过 SQL 语句或
C语言中调用表格数据库,通常指的是通过C程序与数据库进行交互,执行SQL查询以获取、插入、更新或删除表格中的数据,以下是几种常见的方法及其详细步骤:
使用ODBC(Open Database Connectivity)
ODBC是一种标准的数据库访问接口,允许C程序通过统一的API访问多种数据库。
-
安装和配置ODBC驱动:
- 下载并安装适用于目标数据库的ODBC驱动程序。
- 在操作系统中配置ODBC数据源(DSN),指定数据库类型、服务器地址、用户名、密码等信息,这通常通过ODBC数据源管理器完成。
-
编写C代码:
- 包含必要的头文件,如
sql.h和sqlext.h。 - 分配环境句柄、连接句柄和语句句柄。
- 使用
SQLConnect函数连接到配置好的DSN。 - 使用
SQLExecDirect或SQLPrepare和SQLExecute执行SQL查询。 - 使用
SQLFetch和SQLGetData获取查询结果。 - 处理完数据后,释放所有句柄并断开连接。
- 包含必要的头文件,如
#include <stdio.h>
#include <stdlib.h>
#include <sql.h>
#include <sqlext.h>
void check_error(SQLRETURN ret, SQLHANDLE handle, SQLSMALLINT type, const char msg) {
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
printf("Error %s: ", msg);
// 获取并打印错误信息
// ...
exit(EXIT_FAILURE);
}
}
int main() {
SQLHENV hEnv;
SQLHDBC hDbc;
SQLHSTMT hStmt;
SQLRETURN ret;
// 分配环境句柄
ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);
check_error(ret, hEnv, SQL_HANDLE_ENV, "Allocating environment handle");
// 设置ODBC版本
ret = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (void )SQL_OV_ODBC3, 0);
check_error(ret, hEnv, SQL_HANDLE_ENV, "Setting ODBC version");
// 分配连接句柄
ret = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc);
check_error(ret, hDbc, SQL_HANDLE_DBC, "Allocating connection handle");
// 连接到数据源
ret = SQLConnect(hDbc, (SQLCHAR )"DSN_NAME", SQL_NTS, (SQLCHAR )"username", SQL_NTS, (SQLCHAR )"password", SQL_NTS);
check_error(ret, hDbc, SQL_HANDLE_DBC, "Connecting to data source");
// 分配语句句柄
ret = SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
check_error(ret, hStmt, SQL_HANDLE_STMT, "Allocating statement handle");
// 执行SQL查询
ret = SQLExecDirect(hStmt, (SQLCHAR )"SELECT FROM table_name", SQL_NTS);
check_error(ret, hStmt, SQL_HANDLE_STMT, "Executing SQL query");
// 绑定列并获取数据
SQLCHAR col1[256];
SQLINTEGER col1Len;
SQLBindCol(hStmt, 1, SQL_C_CHAR, col1, sizeof(col1), &col1Len);
while ((ret = SQLFetch(hStmt)) != SQL_NO_DATA) {
check_error(ret, hStmt, SQL_HANDLE_STMT, "Fetching data");
printf("Column 1: %s
", col1);
}
// 清理
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
SQLDisconnect(hDbc);
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
return 0;
}
使用MySQL C API
如果目标数据库是MySQL,可以直接使用MySQL提供的C API。
-
安装MySQL开发库:
- 在Linux上,可以使用包管理器安装,如
sudo apt-get install libmysqlclient-dev。
- 在Linux上,可以使用包管理器安装,如
-
编写C代码:
- 包含
mysql.h头文件。 - 使用
mysql_init初始化MYSQL对象。 - 使用
mysql_real_connect连接到数据库。 - 使用
mysql_query执行SQL查询。 - 使用
mysql_store_result和mysql_fetch_row获取查询结果。 - 处理完数据后,使用
mysql_close关闭连接。
- 包含
#include <mysql.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
MYSQL conn;
MYSQL_RES res;
MYSQL_ROW row;
// 初始化MYSQL对象
conn = mysql_init(NULL);
if (conn == NULL) {
fprintf(stderr, "mysql_init failed
");
exit(EXIT_FAILURE);
}
// 连接到数据库
if (mysql_real_connect(conn, "localhost", "user", "password", "database", 0, NULL, 0) == NULL) {
fprintf(stderr, "mysql_real_connect failed: %s
", mysql_error(conn));
mysql_close(conn);
exit(EXIT_FAILURE);
}
// 执行SQL查询
if (mysql_query(conn, "SELECT FROM table_name")) {
fprintf(stderr, "SELECT FROM table_name failed: %s
", mysql_error(conn));
mysql_close(conn);
exit(EXIT_FAILURE);
}
// 获取查询结果
res = mysql_store_result(conn);
if (res == NULL) {
fprintf(stderr, "mysql_store_result failed: %s
", mysql_error(conn));
mysql_close(conn);
exit(EXIT_FAILURE);
}
// 遍历并打印结果集
while ((row = mysql_fetch_row(res))) {
printf("%s
", row[0]); // 假设只打印第一列
}
// 释放结果集并关闭连接
mysql_free_result(res);
mysql_close(conn);
return 0;
}
使用第三方库(如SQLite)
对于轻量级应用,SQLite是一个不错的选择,它提供了一个C库,可以直接嵌入到应用程序中。
-
包含SQLite头文件:
- 下载并包含
sqlite3.h。
- 下载并包含
-
编写C代码:
- 打开数据库(如果不存在则创建)。
- 执行SQL查询。
- 使用回调函数处理查询结果。
- 关闭数据库。
#include <stdio.h>
#include <sqlite3.h>
int callback(void NotUsed, int argc, char argv, char azColName){
for(int i = 0; i<argc; i++){
printf("%s = %s
", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("
");
return 0;
}
int main(){
sqlite3 db;
char zErrMsg = 0;
int rc;
// 打开数据库
rc = sqlite3_open("test.db", &db);
if(rc){
fprintf(stderr, "Can't open database: %s
", sqlite3_errmsg(db));
return(0);
} else {
fprintf(stdout, "Opened database successfully
");
}
// 执行SQL查询
rc = sqlite3_exec(db, "SELECT FROM table_name;", callback, 0, &zErrMsg);
if(rc != SQLITE_OK){
fprintf(stderr, "SQL error: %s
", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Operation done successfully
");
}
// 关闭数据库
sqlite3_close(db);
return 0;
}
FAQs
Q1:如何在C程序中动态构建SQL查询语句?
A1:可以使用sprintf或snprintf函数将变量值插入到SQL查询字符串中,要查询特定用户的信息,可以这样做:
char query[256]; snprintf(query, sizeof(query), "SELECT FROM users WHERE id = %d", user_id);
将query传递给mysql_query或SQLExecDirect等函数执行,注意,直接拼接字符串存在SQL注入风险,实际应用中应使用参数化查询或预处理语句来避免
