【MySQL】(13)C语言连接MySQL

文章目录

  • C 语言连接 MySQL
    • 引入库 & 第一个MySQL C++程序
    • 接口介绍
      • 初始化 & 关闭连接
      • 建立连接
      • 发送 SQL 语句

C 语言连接 MySQL

要使用C语言连接MySQL数据库,可以使用MySQL提供的C API

引入库 & 第一个MySQL C++程序

mysql_get_client_info()

mysql_get_client_info() 是 MySQL C API 提供的一个函数,用于获取当前使用的 MySQL 客户端库的版本信息。

函数原型如下:

const char *mysql_get_client_info(void);

#include 
#include 

using namespace std;

int main() {
    cout << "mysql client version: " << mysql_get_client_info() << endl;
    return 0;
}

结果

mysql client version: 5.5.68-MariaDB

注意:要使用下的函数,需要先链接 MySQL Connector/C 库,在编译时添加 -lmysqlclient 选项

接口介绍

初始化 & 关闭连接

mysql_init() 用于初始化一个 MySQL 连接对象。它返回一个指向 MYSQL 结构体的指针,该结构体代表了一个 MySQL 连接。

函数原型:

MYSQL *mysql_init(MYSQL *mysql);

mysql_init() 接受一个可选的 MYSQL 结构体指针参数 mysql,用于指定要初始化的连接对象。如果传递了 NULL,则会创建一个新的 MYSQL 对象。

对于使用 mysql_init() 初始化的 MySQL 连接对象,需要在使用完后显式关闭连接,以释放相关资源。关闭连接可以使用 mysql_close() 函数。

#include 
#include 

using namespace std;

int main() {
    // 初始化连接对象
    MYSQL *conn = mysql_init(nullptr);

    if (conn == nullptr) {
        cerr << "Failed to initialize MySQL connection.\n";
        return 1;
    }

    // 处理连接对象...

    // 关闭连接对象
    mysql_close(conn);
    
    return 0;
}

在上述代码中,通过调用 mysql_init(NULL) 初始化了一个 MySQL 连接对象。如果初始化成功,将返回一个有效的 MYSQL 指针;否则,返回 NULL。在实际使用时,需要检查返回的指针是否为 NULL,以确保连接对象的创建成功。最后需要使用 mysql_close() 来关闭连接对象

建立连接

mysql_real_connect() 用于建立与 MySQL 服务器的连接。它提供了更详细的选项和参数,可以用于配置连接的各种属性和行为。

函数原型如下:

MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user,
                          const char *passwd, const char *db,
                          unsigned int port, const char *unix_socket,
                          unsigned long client_flag);

参数说明:

  • mysql:一个已初始化的 MYSQL 对象,表示要建立连接的连接对象。
  • host:MySQL 服务器的主机名或 IP 地址。
  • user:连接 MySQL 服务器的用户名。
  • passwd:连接 MySQL 服务器的密码。
  • db:要连接的数据库名。可以为 NULL,表示不选择默认数据库。
  • port:MySQL 服务器的端口号。可以为 0,表示使用默认端口。
  • unix_socket:UNIX 域套接字路径,用于与本地 MySQL 服务器通信。可以为 NULL,表示使用 TCP/IP 连接。
  • client_flag:客户端标志,用于配置连接的各种选项和行为,如设置字符集、启用 SSL 等。可以使用 CLIENT_* 常量进行标志的组合。

#include 
#include 
#include 

using namespace std;

string host = "localhost"; // '127.0.0.1'
string user = "root";
string passwd;
string db = "test_db";
unsigned int port = 8080;

int main() {
    // 初始化连接对象
    MYSQL *conn = mysql_init(nullptr);

    if (conn == nullptr) {
        cerr << "Failed to initialize MySQL connection.\n";
        return 1;
    }

    // 建立连接
    if (mysql_real_connect(conn, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr) {
        cerr << mysql_error(conn) << endl;
        return 1;
    }

    cout << "mysql_real_connect success" << endl;

    // 处理连接对象...

    // 关闭连接对象
    mysql_close(conn);

    return 0;
}

发送 SQL 语句

mysql_query() 用于向 MySQL 服务器发送 SQL 查询或语句,并执行该查询或语句。

函数原型如下:

int mysql_query(MYSQL *mysql, const char *query);

参数说明:

  • mysql:一个已连接的 MYSQL 对象,表示要执行查询的连接对象。
  • query:要执行的 SQL 查询或语句的字符串。

mysql_query() 函数将传入的 SQL 查询或语句发送到 MySQL 服务器,并执行它。执行结果取决于查询或语句的类型。对于 SELECT 查询,可以使用 mysql_store_result() 函数获取查询结果集。对于其他类型的查询或语句,可以使用 mysql_affected_rows() 函数获取受影响的行数。

如果执行查询或语句成功,mysql_query() 函数将返回 0;否则,返回非零值。


mysql_store_result() 用于将查询结果一次性读取到客户端内存中,并返回一个指向 MYSQL_RES 结构体的指针。

函数原型如下:

MYSQL_RES *mysql_store_result(MYSQL *mysql);

参数说明:

  • mysql:一个已连接的 MYSQL 对象,表示要处理查询结果的连接对象。

mysql_store_result() 返回一个指向 MYSQL_RES 结构体的指针,该结构体包含了查询结果集的相关信息,如列数、行数、字段名称等。


mysql_fetch_row() 用于从查询结果集中获取下一行数据,并返回一个指向结果行数据的指针。

函数原型如下:

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

参数说明:

  • result:一个指向 MYSQL_RES 结构体的指针,表示要获取数据的结果集。

mysql_fetch_row() 函数用于遍历查询结果集的行数据。每次调用该函数,它会返回结果集的下一行数据,并将结果以字符串数组(char**)的形式返回。


mysql_free_result() 函数用于释放通过 mysql_store_result()mysql_use_result() 获取的查询结果集所占用的内存资源。在完成对结果集的处理后,应调用该函数来释放内存,以避免内存泄漏。


#include 
#include 
#include 

using namespace std;

string host = "localhost"; // '127.0.0.1'
string user = "root";
string passwd;
string db = "test_db";
unsigned int port = 8080;

int main() {
    // 初始化连接对象
    MYSQL *conn = mysql_init(nullptr);

    if (conn == nullptr) {
        cerr << "Failed to initialize MySQL connection.\n";
        return 1;
    }

    mysql_options(conn, MYSQL_SET_CHARSET_NAME, "utf8"); // 设置连接字符集为 utf8,防止中文乱码
    
    // 建立连接
    if (mysql_real_connect(conn, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr) {
        cerr << mysql_error(conn) << endl;
        return 1;
    }

    cout << "mysql_real_connect success" << endl;

    // 执行查询并获取结果集
    string sql = "select * from users";
    if (mysql_query(conn, sql.c_str())) {
        cerr << mysql_error(conn);
        return 1;
    }
    MYSQL_RES *result = mysql_store_result(conn);

    //遍历结果集合并输出
    MYSQL_ROW row;
    while ((row = mysql_fetch_row(result)) != nullptr) {
        printf("%s\t%s\t%s\n", row[0], row[1], row[2]);
    }

    // 释放结果集
    mysql_free_result(result);

    // 关闭连接对象
    mysql_close(conn);

    return 0;
}

在上述代码中,使用 mysql_fetch_row() 函数在一个 while 循环中遍历结果集的每一行数据,并通过访问 row 数组中的元素输出数据。row 数组的索引对应结果集中的列索引,从 0 开始。最后,使用 mysql_free_result() 函数释放结果集的内存资源。

结果:

mysql_real_connect success
7       张小凡  1329ebf6352bb67d4e2f6e2024d2f72c
8       王小磊  6e49be674cee12dc2f333296c675db49
9       李婷婷  135abaf36b2e5803c97a6db4c1fe83c6
10      赵丽丽  45791c398b4dab808a8c1ae2bf8caaac
11      刘伟东  a0aada9b4933edd0f5da12c3194b6d5f
12      陈冬梅  b410ad83ff45a3f9ec91bb8ddbdb4096

其他关于查询结果的函数:

  • 获取结果行数

    my_ulonglong mysql_num_rows(MYSQL_RES *res);
    
  • 获取结果列数

    unsigned int mysql_num_fields(MYSQL_RES *res);
    
  • 获取列名

    MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
    

你可能感兴趣的:(MySQL数据库,mysql,c语言,数据库,开发语言)