c++连接mysql(API)

以读取数据为例:


第一步,要将你的C++程序与Mysql连接起来,这里要用到函数mysql_real_connect()

第二步,执行查询语句,这里要用到函数mysql_query()

第三步,查询语句查询到的结果,称为结果集,第三步就是要将结果集中的所有数据,存放在一个变量A中,类型为MYSQL_RES

注意:这个变量中存放的数据,是以“行”和“列”为结构的,也就是一整个表。

例如:

身份证号	姓名	性别	余额 
1111	Mike	男	50
2222	John	男	30

第四步
虽然所有数据都存放进了上一步的变量A中,但你还不能把A作为一个整体输出到屏幕上,而需要另一个变量B,类型为MYSQL_ROW,变量B类似一个一维数组,一次只能储存一行变量A中的数据,而下标[ ]表示列,假设变量B当前储存了变量A中的第一行,则B[2]就是指这一行的第二列,也就是Mike,将变量A中的一行赋给变量B的函数叫做mysql_fetch_row(),而为了将变量B中储存的数据全部输出到屏幕,则需要用到循环

第五步,最后用完了,要释放内存,并关闭和数据库的连接。

实际上,还有一个最重要的变量,类型为MYSQL(从类型的名字就可以看出来很重要),是必须在第一步之前就声明的,试想,C++程序与Mysql这两个本来毫无关联的东西,是怎么联系起来的呢?

如果C+程序在mysql内部,有一个“通信兵”,这个“通信兵”在C++连接mysql时承担重要的作用。而变量A又是怎么储存查询得到的结果集的呢,这也需要这个“通信兵”先在mysql内找到这个结果集的地址,再通过一个函数,mysql_store_result(),把结果集的地址告诉这个函数,让这个函数把这个地址储存的值(也就是结果集),赋给变量A。

类型和API介绍


类型:

MYSQL:该结构代表1个数据库连接的句柄。几乎所有的MySQL函数均使用它。

MYSQL_RES:该结构代表返回行的查询结果(例如SELECT查询语句)。在本节的剩余部分,将查询返回的信息称为“结果集”。(也就是前面提到的变量A)

MYSQL_ROW:这是1行数据的“类型安全”表示,行是通过调用mysql_fetch_row()从MYSQL_RES型变量中获得的。(也就是前面提到的变量B)

例如定义一个MYSQL_RES和一个MYSQL_ROW变量,并将MYSQL_RES中的一行赋给MYSQL_ROW变量

MYSQL mysql;
MYSQL_RES *result;
MYSQL ROW row;
//.....为result赋值部分省略
 
row = mysql_fetch_row(result);
//每成功调用一次mysql_fetch_row(),就滑向下一行,若到达最后一行,则返回NULL
//所以下次调用mysql_fetch_row(result)时,就是将下一行赋给一个MYSQL_ROW变量
API:

mysql_init(MYSQL *mysql):用于初始化MYSQL变量

MYSQL mysql;
mysql_init(&mysql);

mysql_real_connect():连接MYSQL,有8个参数,

第一个参数是MYSQL变量的地址,

第二个参数是主机名或IP地址,如果“host”是NULL或字符串""或“127.0.0.1”,连接将被视为与本地主机的连接,

第三个参数是MySQL登录ID

第四个参数是用户的密码

第五个参数是数据库名称

第六个参数是TCP/IP连接的端口号

第七个参数一般为NULL,不需要了解

第八个参数一般为0,不需要了解

例如:

mysql_real_connect(&mysql, "127.0.0.1/localhost", "root", "123", "db", 3306, NULL, 0)

int mysql_set_character_set()

int mysql_set_character_set(MYSQL *mysql, char *csname)

设定登陆的字符集 – 登陆之后

:mysql_set_character_set(&mysql, "gbk");
mysql 连接句柄
csname 字符集的名称 utf8

mysql_query(MYSQL *mysql, const char *query):向数据库发送查询语句(int 型)

成功 返回 0
失败 返回 非0

第一个参数为MYSQL变量的地址,第二个参数为"查询语句"

例如:

mysql_query(&mysql, "SELECT * FROM stuinfo");

获取结果集
++MYSQL_RES *mysql_store_result++

MYSQL_RES *mysql_store_result(MYSQL *mysql)

mysql_store_result():将mysql_query()查询到的结果集,赋给MYSQL_RES变量
只有一个参数,为MYSQL变量的地址

例如:

result = mysql_store_result(&mysql);`

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

将MYSQL_RES变量中的一行赋给MYSQL_ROW变量,当重复调用mysql_fetch_row()时,将逐个获取结果集的行,到最后一行后返回NULL

该函数是取出结果集中的一行,这一行是肯定还未取出的,每次取完一行,下次取就会自动取下一行,这叫游标。

返回值MYSQL_ROW其实是一个char **类型的指针,其实就是把表格中的一行的每列都变成一个字符串。然后构成的数组就是MYSQL_ROW类型。返回的MYSQL_ROW是检索结果集的下一行,也就是表的第一行是检索不到的,所以表头需要额外函数进行检索。

while ((row = mysql_fetch_row(result))){  //遇到最后一行,则中止循环
        for (int i = 0; i < num; i++) {         //利用for循环,输出该行的每一列
            cout << row[i] << "\t";    //row是MYSQL_ROW变量,可以当做数组使用,i为列数
        }
        cout << endl;
    }

unsigned int mysql_num_fields(MYSQL_RES *result):获取结果集中的列数,返回值为整型

unsigned long *mysql_fetch_lengths(MYSQL_RES *result):返回表的列数

 unsigned int num_fields;
 unsigned long *lengths;
 num_field=mysql_num_fields(result);
 lengths=mysql_fetch_lengths(result);

注意

你可以从指向结果集的指针或指向连接句柄的指针获得行数。如果**mysql_store_result()mysql_use_result()返回NULL,应使用连接句柄(因而没有结果集指针)。在该情况下,可调用mysql_field_count()来判断mysql_store_result()**是否生成了非空结果。这样,客户端程序就能采取恰当的行动,而不需要知道查询是否是select语句(或类似SELECT的语句)

MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result):

返回采用MYSQL_FIELD结构的结果集的列。重复调用该函数,以检索关于结果集中所有列的信息。未剩余字段时,mysql_fetch_field()返回NULL。
该函数是取出表头,也就是每一列的列名。
返回值是一个结构体,结构体中有一个name成员变量存放的就是列名,并且和MYSQL_ROW类似,也是每一个列使用一个结构体,所以返回的是一个结构体数组的指针。

MYSQL_FIELD *field; //字段名
field = mysql_fetch_field(result);

**每次执行新的SELECT查询时,将复位mysql_fetch_field(),以返回关于第1个字段的信息。调用mysql_field_seek()也会影响mysql_fetch_field()返回的字段。

如果调用了mysql_query()以在表上执行SELECT,但未调用mysql_store_result(),如果调用了mysql_fetch_field()以请求BLOB字段的长度,MySQL将返回默认的Blob长度(8KB)。之所以选择8KB是因为MySQL不知道BLOB的最大长度。应在日后使其成为可配置的。一旦检索了结果集,field->max_length将包含特定查询中该列的最大值的长度。**

返回值:
当前列的MYSQL_FIELD结构。如果未剩余任何列,返回NULL。

my_ulonglong mysql_affected_rows(MYSQL *mysql):
显示受影响的行数

mysql_affected_rows(mysql);

描述
返回上次UPDATE更改的行数,上次DELETE删除的行数,或上次INSERT语句插入的行数。对于UPDATE、DELETE或INSERT语句,可在mysql_query()后立刻调用。对于SELECT语句,mysql_affected_rows()的工作方式与mysql_num_rows()类似。

返回值
大于0的整数表明受影响或检索的行数。“0”表示UPDATE语句未更新记录,在查询中没有与WHERE匹配的行,或未执行查询。“-1”表示查询返回错误,或者,对于SELECT查询,在调用mysql_store_result()之前调用了mysql_affected_rows()因mysql_affected_rows()返回无符号值,通过比较返回值和“(my_ulonglong)-1”或等效的“(my_ulonglong)~0”,检查是否为“-1”。

void mysql_free_result():释放结果集

void mysql_free_result(MYSQL_RES *result)

mysql_free_result(result);

代码示例



#include <iostream>
#include <winsock.h>
#include <string>
#include "mysql.h"
using namespace std;

int main()
{
    MYSQL mysql;
    mysql_init(&mysql); // 初始化
    MYSQL* ConnStatus = mysql_real_connect(&mysql, "localhost", "root", "写你的密码", "itcast", 3306, 0, 0);
    
    if (ConnStatus == NULL)
    {
        // 连接失败
        int i = mysql_errno(&mysql);
        string strError = mysql_error(&mysql);
        cout << "Error info: " << strError << endl;
        return 0;
    }

    cout << "Mysql Connected..." << endl;
    string strsql;
    MYSQL_RES* result = NULL; // 数据结果集
    MYSQL_ROW row;
    int num,i;
    // 插入操作
    strsql = "insert into t1 values(2,'lyb')";
    mysql_query(&mysql, "set names gbk");
    //事务
    mysql_query(&mysql, "START TRANSACTION"); // 开启事务, 如果没有开启事务,那么效率会变得非常低下!

    for (int i = 0; i < 10; i++)
    {
        mysql_query(&mysql, strsql.c_str());
    }

    mysql_query(&mysql, "COMMIT");   // 提交事务
    //查询
    mysql_query(&mysql, "select * from stuinfo");

    result = mysql_store_result(&mysql);
    num = mysql_num_fields(result);
    while ((row = mysql_fetch_row(result)))  //遇到最后一行,则中止循环
    {
        for (i = 0; i < num; i++)         //利用for循环,输出该行的每一列
        {
            cout << row[i] << "\t";    //row是MYSQL_ROW变量,可以当做数组使用,i为列数
        }
        cout << endl;
    }
    cout << "insert end" << endl;
    //释放结果集 关闭数据库
    mysql_free_result(result);
    mysql_close(&mysql);
    mysql_library_end();
    return 0;
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值