当前位置:首页 > 行业动态 > 正文

C语言连接数据库代码详解及疑难问题解答

c,#include,#includeint main() {, MYSQL conn;, 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() failedn");, mysql_close(conn);, return 1;, } printf("Connected to database successfully!n");, mysql_close(conn);, return 0;,},

在C语言中连接数据库,主要有ODBC、MySQL C API和SQLite这几种方式。

ODBC

1、安装ODBC驱动

在Windows系统上,可以通过“控制面板 -> 管理工具 -> 数据源 (ODBC)”来管理ODBC驱动。

在Linux系统上,可以使用unixODBC。

2、配置数据源名称(DSN)

在使用ODBC连接数据库之前,需要配置数据源名称(DSN),这可以通过ODBC管理工具来完成,DSN包含了数据库连接的配置信息,如数据库类型、服务器地址、数据库名称、用户和密码等。

C语言连接数据库代码详解及疑难问题解答

3、使用C代码连接数据库

以下是一个使用ODBC连接数据库的C代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <sql.h>
#include <sqlext.h>
void check_error(SQLRETURN ret, SQLSMALLINT handleType, SQLHANDLE handle) {
    if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
        SQLCHAR sqlState[6], message[SQL_MAX_MESSAGE_LENGTH];
        SQLINTEGER nativeError;
        SQLSMALLINT messageLength;
        SQLGetDiagRec(handleType, handle, 1, sqlState, &nativeError, message, sizeof(message), &messageLength);
        fprintf(stderr, "Error: %s
", message);
        exit(EXIT_FAILURE);
    }
}
int main() {
    SQLHENV env;
    SQLHDBC dbc;
    SQLHSTMT stmt;
    SQLRETURN ret;
    // Allocate an environment handle
    ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
    check_error(ret, SQL_HANDLE_ENV, env);
    // Set the ODBC version environment attribute
    ret = SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void )SQL_OV_ODBC3, 0);
    check_error(ret, SQL_HANDLE_ENV, env);
    // Allocate a connection handle
    ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
    check_error(ret, SQL_HANDLE_DBC, dbc);
    // Connect to the DSN named "DSNName"
    ret = SQLConnect(dbc, (SQLCHAR )"DSNName", SQL_NTS, (SQLCHAR )"username", SQL_NTS, (SQLCHAR )"password", SQL_NTS);
    check_error(ret, SQL_HANDLE_DBC, dbc);
    // Allocate a statement handle
    ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
    check_error(ret, SQL_HANDLE_STMT, stmt);
    // Execute a SQL query
    ret = SQLExecDirect(stmt, (SQLCHAR )"SELECT  FROM table_name", SQL_NTS);
    check_error(ret, SQL_HANDLE_STMT, stmt);
    // Fetch and display the result set
    SQLCHAR col1[256], col2[256];
    while (SQLFetch(stmt) == SQL_SUCCESS) {
        SQLGetData(stmt, 1, SQL_C_CHAR, col1, sizeof(col1), NULL);
        SQLGetData(stmt, 2, SQL_C_CHAR, col2, sizeof(col2), NULL);
        printf("%s, %s
", col1, col2);
    }
    // Clean up
    SQLFreeHandle(SQL_HANDLE_STMT, stmt);
    SQLDisconnect(dbc);
    SQLFreeHandle(SQL_HANDLE_DBC, dbc);
    SQLFreeHandle(SQL_HANDLE_ENV, env);
    return 0;
}

MySQL C API

1、安装MySQL开发库

在Debian或Ubuntu系统上,可以使用以下命令安装MySQL开发库:sudo apt-get install libmysqlclient-dev

C语言连接数据库代码详解及疑难问题解答

在CentOS或Red Hat系统上,可以使用以下命令安装MySQL开发库:sudo yum install mysql-devel

2、使用C代码连接数据库

以下是一个使用MySQL C API连接数据库的C代码示例:

#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
    MYSQL conn;
    MYSQL_RES res;
    MYSQL_ROW row;
    char server = "localhost";
    char user = "root";
    char password = "your_password"; / set me first /
    char database = "your_database";
    conn = mysql_init(NULL);
    / Connect to database /
    if (!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0)) {
        fprintf(stderr, "%s
", mysql_error(conn));
        exit(1);
    }
    / send SQL query /
    if (mysql_query(conn, "show tables")) {
        fprintf(stderr, "%s
", mysql_error(conn));
        exit(1);
    }
    res = mysql_use_result(conn);
    / output table name /
    printf("MySQL Tables in %s database:
", database);
    while ((row = mysql_fetch_row(res)) != NULL)
        printf("%s 
", row[0]);
    / close connection /
    mysql_free_result(res);
    mysql_close(conn);
    return 0;
}

SQLite

1、安装SQLite开发库

C语言连接数据库代码详解及疑难问题解答

在Ubuntu上,可以使用以下命令安装SQLite开发库:sudo apt-get install libsqlite3-dev

在CentOS上,可以使用以下命令安装SQLite开发库:sudo yum install sqlite-devel

2、使用C代码连接数据库

以下是一个使用SQLite连接数据库的C代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
int main() {
    sqlite3 db;
    char err_msg = 0;
    int rc = sqlite3_open("test.db", &db);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "Cannot open database: %s
", sqlite3_errmsg(db));
        sqlite3_close(db);
        return 1;
    }
    char sql = "CREATE TABLE IF NOT EXISTS Cars(Id INT, Name TEXT, Price INT);"
                "INSERT INTO Cars VALUES(1, 'Audi', 52642);"
                "INSERT INTO Cars VALUES(2, 'Mercedes', 57127);"
                "INSERT INTO Cars VALUES(3, 'Skoda', 9000);"
                "INSERT INTO Cars VALUES(4, 'Volvo', 29000);"
                "INSERT INTO Cars VALUES(5, 'Bentley', 350000);";
    rc = sqlite3_exec(db, sql, 0, 0, &err_msg);
    if (rc != SQLITE_OK ) {
        fprintf(stderr, "SQL error: %s
", err_msg);
        sqlite3_free(err_msg);
        sqlite3_close(db);
        return 1;
    }
    sqlite3_close(db);
    return 0;
}