• C++操作mysql__通过mysql的c api连接mysql服务器


    C++通过mysql的c api连接mysql服务器

    1、在连接之前,不要忘记打开mysql服务器哇(Navicat打开或者不打开都可以)

    2、添加包含目录

    3、添加libmysql.lib到附属依赖中

    上一步中也也可以在程序代码的开始处加上#pragma comment(lib,"D:\Program Files\MySQL\MySQL Server 5.6\lib\libmysql.lib") 来导入libmysql.lib)

    4、如果使用的mysql是64位的,还需要将项目的解决方案平台由win32改成x64

     

    5、将D:Program FilesMySQLMySQL Server 5.6lib(根据具体路径而定)下的libmysql.dll复制到项目中去,和.cpp,.h文件位于同一路径下

     实例代码:

     1 #include <stdio.h>
     2 #include <mysql.h> // 如果配置ok就可以直接包含这个文件
     3 int main(void)
     4 {
     5     MYSQL mysql;    //一个数据库结构体
     6     MYSQL_RES* res; //一个结果集结构体
     7     MYSQL_ROW row;  //char** 二维数组,存放一条条记录
     8                     
     9     mysql_init(&mysql);//初始化数据库
    10     //设置编码方式
    11     mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
    12     //连接数据库
    13     //判断如果连接失败就输出连接失败。
    14     if (mysql_real_connect(&mysql, "localhost", "root", "123456", "mysql", 3306, NULL, 0) == NULL)  //mysql是一个数据库
    15         printf("连接失败!\n");
    16     //查询数据
    17     mysql_query(&mysql, "select * from db");  //db是数据库下的一个表
    18     //获取结果集
    19     res = mysql_store_result(&mysql);
    20 
    21     //给ROW赋值,判断ROW是否为空,不为空就打印数据。
    22     while (row = mysql_fetch_row(res))
    23     {
    24         printf("%s  ", row[0]);//打印ID      打印第一列
    25         printf("%s  ", row[1]);//打印姓名    打印第二列
    26         printf("%s  ", row[2]);//            打印第三列
    27         printf("%s  ", row[3]);
    28         printf("%s  ", row[4]);
    29         printf("%s  ", row[5]);
    30         printf("%s  
    ", row[6]);
    31     }
    32     //释放结果集
    33     mysql_free_result(res);
    34     //关闭数据库
    35     mysql_close(&mysql);
    36     //停留等待
    37     system("pause");
    38     return 0;
    39 }
    View Code

    Navicat中的信息:

    C++通过mysql的c api连接mysql服务器,并对数据库中的内容进行增删修改操作

    在上面操作的基础上,修改代码如下:

      1 #include <stdio.h>
      2 #include <WinSock.h>  //一定要包含这个,或者winsock2.h
      3 //#include "include/mysql.h"    //引入mysql头文件(一种方式是在vc目录里面设置,一种是文件夹拷到工程目录,然后这样包含)
      4 #include "mysql.h"  
      5 #include <Windows.h>
      6 
      7 //包含附加依赖项,也可以在工程--属性里面设置
      8 #pragma comment(lib,"wsock32.lib")
      9 #pragma comment(lib,"libmysql.lib")
     10 MYSQL mysql; //mysql连接
     11 MYSQL_FIELD *fd;  //字段行数组
     12 char field[32][32];  //存字段名二维数组
     13 MYSQL_RES *res; //这个结构代表返回行的一个查询结果集
     14 MYSQL_ROW column; //一个行数据的类型安全(type-safe)的表示,表示数据行的列
     15 char query[150]; //存放mysql查询语句
     16 
     17 bool ConnectDatabase();     //函数声明
     18 void FreeConnect();
     19 bool QueryDatabase1();  //查询1
     20 bool QueryDatabase2();  //查询2
     21 bool InsertData();
     22 bool ModifyData();
     23 bool DeleteData();
     24 
     25 int main(int argc, char **argv)
     26 {
     27     ConnectDatabase();
     28     QueryDatabase1();
     29     InsertData();
     30     QueryDatabase2();
     31     ModifyData();
     32     QueryDatabase2();
     33     DeleteData();
     34     QueryDatabase2();
     35     FreeConnect();
     36     system("pause");
     37     return 0;
     38 }
     39 //连接数据库
     40 bool ConnectDatabase()
     41 {
     42     //初始化mysql
     43     mysql_init(&mysql);  //连接mysql,数据库
     44 
     45     //返回false则连接失败,返回true则连接成功
     46     if (!(mysql_real_connect(&mysql, "localhost", "root", "123456", "test", 0, NULL, 0))) //中间分别是主机,用户名,密码,数据库名,端口号(可以写默认0或者3306等),可以先写成参数再传进去
     47     {
     48         printf("Error connecting to database:%s
    ", mysql_error(&mysql));
     49         return false;
     50     }
     51     else
     52     {
     53         printf("Connected...
    ");
     54         return true;
     55     }
     56 }
     57 //释放资源
     58 void FreeConnect()
     59 {
     60     //释放资源
     61     mysql_free_result(res);
     62     mysql_close(&mysql);
     63 }
     64 /***************************数据库操作***********************************/
     65 //其实所有的数据库操作都是先写个sql语句,然后用mysql_query(&mysql,query)来完成,包括创建数据库或表,增删改查
     66 //查询数据
     67 //int sprintf(char* str,const char* format,...) 发送格式化输出到str所指向的字符串
     68 bool QueryDatabase1()
     69 {
     70     sprintf(query, "select * from user"); //执行查询语句,这里是查询所有,user是表名,不用加引号,用strcpy也可以
     71     mysql_query(&mysql, "set names gbk"); //设置编码格式(SET NAMES GBK也行),否则cmd下中文乱码
     72     //返回0 查询成功,返回1查询失败
     73     if (mysql_query(&mysql, query))        //执行SQL语句
     74     {
     75         printf("Query failed (%s)
    ", mysql_error(&mysql));
     76         return false;
     77     }
     78     else
     79     {
     80         printf("query success
    ");
     81     }
     82     //获取结果集
     83     if (!(res = mysql_store_result(&mysql)))    //获得sql语句结束后返回的结果集
     84     {
     85         printf("Couldn't get result from %s
    ", mysql_error(&mysql));
     86         return false;
     87     }
     88 
     89     //打印数据行数
     90     printf("number of dataline returned: %lld
    ", mysql_affected_rows(&mysql));  //此处原本是%d但是会报错,根据原因改成了%lld,lld表示长整形
     91 
     92     //获取字段的信息
     93     char *str_field[32];  //定义一个字符串数组存储字段信息
     94     for (int i = 0; i < 4; i++)   //在已知字段数量的情况下获取字段名
     95     {
     96         str_field[i] = mysql_fetch_field(res)->name;
     97     }
     98     for (int i = 0; i < 4; i++)   //打印字段
     99         printf("%10s	", str_field[i]);  //此处有个制表符	
    100     printf("
    ");
    101     //打印获取的数据
    102     while (column = mysql_fetch_row(res))   //在已知字段数量情况下,获取并打印下一行
    103     {
    104         printf("%10s	%10s	%10s	%10s
    ", column[0], column[1], column[2], column[3]);  //column是列数组 每一个数据后面都有一个制表符,cout是没有制表符的吧
    105     }
    106     return true;
    107 }
    108 bool QueryDatabase2()
    109 {
    110     mysql_query(&mysql, "set names gbk");
    111     //返回0 查询成功,返回1查询失败
    112     if (mysql_query(&mysql, "select * from user"))        //执行SQL语句
    113     {
    114         printf("Query failed (%s)
    ", mysql_error(&mysql));
    115         return false;
    116     }
    117     else
    118     {
    119         printf("query success
    ");
    120     }
    121     res = mysql_store_result(&mysql);
    122     //打印数据行数
    123     printf("number of dataline returned: %lld
    ", mysql_affected_rows(&mysql));
    124     for (int i = 0; fd = mysql_fetch_field(res); i++)  //获取字段名
    125         strcpy(field[i], fd->name);
    126     int j = mysql_num_fields(res);  // 获取列数
    127     for (int i = 0; i < j; i++)  //打印字段
    128         printf("%10s	", field[i]);
    129     printf("
    ");
    130     while (column = mysql_fetch_row(res))
    131     {
    132         for (int i = 0; i < j; i++)
    133             printf("%10s	", column[i]);
    134         printf("
    ");
    135     }
    136     return true;
    137 }
    138 //插入数据
    139 bool InsertData()
    140 {
    141     sprintf(query, "insert into user values (6, 'Lilei', '123','lilei23@sina.cn');");  //可以想办法实现手动在控制台手动输入指令
    142     if (mysql_query(&mysql, query))        //执行SQL语句
    143     {
    144         printf("Query failed (%s)
    ", mysql_error(&mysql));  //可以检查输入的信息是否有错误,比如输入的类型和字段的类型是否匹配
    145         return false;
    146     }
    147     else
    148     {
    149         printf("Insert success
    ");
    150         return true;
    151     }
    152 }
    153 //修改数据
    154 bool ModifyData()
    155 {
    156     sprintf(query, "update user set email='lilei325@163.com' where name='Lilei'");
    157     if (mysql_query(&mysql, query))        //执行SQL语句
    158     {
    159         printf("Query failed (%s)
    ", mysql_error(&mysql));
    160         return false;
    161     }
    162     else
    163     {
    164         printf("Modify success
    ");
    165         return true;
    166     }
    167 }
    168 //删除数据
    169 bool DeleteData()
    170 {
    171     /*sprintf(query, "delete from user where id=6");*/
    172     char query[100];
    173     printf("please input the sql:
    ");
    174     gets_s(query);  //这里手动输入sql语句
    175     if (mysql_query(&mysql, query))        //执行SQL语句
    176     {
    177         printf("Query failed (%s)
    ", mysql_error(&mysql));
    178         return false;
    179     }
    180     else
    181     {
    182         printf("Delete success
    ");
    183         return true;
    184     }
    185 }
    C++对数据库中的数据做增删修改操作

    执行结果:

     参考博客:https://www.cnblogs.com/47088845/p/5706496.html#top

  • 相关阅读:
    洛谷.1110.[ZJOI2007]报表统计(Multiset Heap)
    洛谷.1110.[ZJOI2007]报表统计(Multiset)
    洛谷.3809.[模板]后缀排序(后缀数组 倍增) & 学习笔记
    洛谷.2801.教主的魔法(分块 二分)
    洛谷.2709.小B的询问(莫队)
    COGS.1901.[模板][国家集训队2011]数颜色(带修改莫队)
    COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)
    COGS.1689.[HNOI2010]Bounce 弹飞绵羊(分块)
    COGS.264.数列操作(分块 单点加 区间求和)
    COGS.1317.数列操作c(分块 区间加 区间求和)
  • 原文地址:https://www.cnblogs.com/YiYA-blog/p/11076001.html
Copyright © 2020-2023  润新知