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 Files\MySQL\MySQL Server 5.6\lib(根据具体路径而定)下的libmysql.dll复制到项目中去,和.cpp,.h文件位于同一路径下
实例代码:

1 1 #include <stdio.h> 2 2 #include <mysql.h> // 如果配置ok就可以直接包含这个文件 3 3 int main(void) 4 4 { 5 5 MYSQL mysql; //一个数据库结构体 6 6 MYSQL_RES* res; //一个结果集结构体 7 7 MYSQL_ROW row; //char** 二维数组,存放一条条记录 8 8 9 9 mysql_init(&mysql);//初始化数据库 1010 //设置编码方式 1111 mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk"); 1212 //连接数据库 1313 //判断如果连接失败就输出连接失败。 1414 if (mysql_real_connect(&mysql, "localhost", "root", "123456", "mysql", 3306, NULL, 0) == NULL) //mysql是一个数据库 1515 printf("连接失败!\\n"); 1616 //查询数据 1717 mysql_query(&mysql, "select * from db"); //db是数据库下的一个表 1818 //获取结果集 1919 res = mysql_store_result(&mysql); 2020 2121 //给ROW赋值,判断ROW是否为空,不为空就打印数据。 2222 while (row = mysql_fetch_row(res)) 2323 { 2424 printf("%s ", row[0]);//打印ID 打印第一列 2525 printf("%s ", row[1]);//打印姓名 打印第二列 2626 printf("%s ", row[2]);// 打印第三列 2727 printf("%s ", row[3]); 2828 printf("%s ", row[4]); 2929 printf("%s ", row[5]); 3030 printf("%s \n", row[6]); 3131 } 3232 //释放结果集 3333 mysql_free_result(res); 3434 //关闭数据库 3535 mysql_close(&mysql); 3636 //停留等待 3737 system("pause"); 3838 return 0; 3939 }
View Code

Navicat中的信息:

C++通过mysql的c api连接mysql服务器,并对数据库中的内容进行增删修改操作
在上面操作的基础上,修改代码如下:

1 1 #include <stdio.h> 2 2 #include <WinSock.h> //一定要包含这个,或者winsock2.h 3 3 //#include "include/mysql.h" //引入mysql头文件(一种方式是在vc目录里面设置,一种是文件夹拷到工程目录,然后这样包含) 4 4 #include "mysql.h" 5 5 #include <Windows.h> 6 6 7 7 //包含附加依赖项,也可以在工程--属性里面设置 8 8 #pragma comment(lib,"wsock32.lib") 9 9 #pragma comment(lib,"libmysql.lib") 10 10 MYSQL mysql; //mysql连接 11 11 MYSQL_FIELD *fd; //字段行数组 12 12 char field[32][32]; //存字段名二维数组 13 13 MYSQL_RES *res; //这个结构代表返回行的一个查询结果集 14 14 MYSQL_ROW column; //一个行数据的类型安全(type-safe)的表示,表示数据行的列 15 15 char query[150]; //存放mysql查询语句 16 16 17 17 bool ConnectDatabase(); //函数声明 18 18 void FreeConnect(); 19 19 bool QueryDatabase1(); //查询1 20 20 bool QueryDatabase2(); //查询2 21 21 bool InsertData(); 22 22 bool ModifyData(); 23 23 bool DeleteData(); 24 24 25 25 int main(int argc, char **argv) 26 26 { 27 27 ConnectDatabase(); 28 28 QueryDatabase1(); 29 29 InsertData(); 30 30 QueryDatabase2(); 31 31 ModifyData(); 32 32 QueryDatabase2(); 33 33 DeleteData(); 34 34 QueryDatabase2(); 35 35 FreeConnect(); 36 36 system("pause"); 37 37 return 0; 38 38 } 39 39 //连接数据库 40 40 bool ConnectDatabase() 41 41 { 42 42 //初始化mysql 43 43 mysql_init(&mysql); //连接mysql,数据库 44 44 45 45 //返回false则连接失败,返回true则连接成功 46 46 if (!(mysql_real_connect(&mysql, "localhost", "root", "123456", "test", 0, NULL, 0))) //中间分别是主机,用户名,密码,数据库名,端口号(可以写默认0或者3306等),可以先写成参数再传进去 47 47 { 48 48 printf("Error connecting to database:%s\n", mysql_error(&mysql)); 49 49 return false; 50 50 } 51 51 else 52 52 { 53 53 printf("Connected...\n"); 54 54 return true; 55 55 } 56 56 } 57 57 //释放资源 58 58 void FreeConnect() 59 59 { 60 60 //释放资源 61 61 mysql_free_result(res); 62 62 mysql_close(&mysql); 63 63 } 64 64 /***************************数据库操作***********************************/ 65 65 //其实所有的数据库操作都是先写个sql语句,然后用mysql_query(&mysql,query)来完成,包括创建数据库或表,增删改查 66 66 //查询数据 67 67 //int sprintf(char* str,const char* format,...) 发送格式化输出到str所指向的字符串 68 68 bool QueryDatabase1() 69 69 { 70 70 sprintf(query, "select * from user"); //执行查询语句,这里是查询所有,user是表名,不用加引号,用strcpy也可以 71 71 mysql_query(&mysql, "set names gbk"); //设置编码格式(SET NAMES GBK也行),否则cmd下中文乱码 72 72 //返回0 查询成功,返回1查询失败 73 73 if (mysql_query(&mysql, query)) //执行SQL语句 74 74 { 75 75 printf("Query failed (%s)\n", mysql_error(&mysql)); 76 76 return false; 77 77 } 78 78 else 79 79 { 80 80 printf("query success\n"); 81 81 } 82 82 //获取结果集 83 83 if (!(res = mysql_store_result(&mysql))) //获得sql语句结束后返回的结果集 84 84 { 85 85 printf("Couldn't get result from %s\n", mysql_error(&mysql)); 86 86 return false; 87 87 } 88 88 89 89 //打印数据行数 90 90 printf("number of dataline returned: %lld\n", mysql_affected_rows(&mysql)); //此处原本是%d但是会报错,根据原因改成了%lld,lld表示长整形 91 91 92 92 //获取字段的信息 93 93 char *str_field[32]; //定义一个字符串数组存储字段信息 94 94 for (int i = 0; i < 4; i++) //在已知字段数量的情况下获取字段名 95 95 { 96 96 str_field[i] = mysql_fetch_field(res)->name; 97 97 } 98 98 for (int i = 0; i < 4; i++) //打印字段 99 99 printf("%10s\t", str_field[i]); //此处有个制表符\t 100100 printf("\n"); 101101 //打印获取的数据 102102 while (column = mysql_fetch_row(res)) //在已知字段数量情况下,获取并打印下一行 103103 { 104104 printf("%10s\t%10s\t%10s\t%10s\n", column[0], column[1], column[2], column[3]); //column是列数组 每一个数据后面都有一个制表符,cout是没有制表符的吧 105105 } 106106 return true; 107107 } 108108 bool QueryDatabase2() 109109 { 110110 mysql_query(&mysql, "set names gbk"); 111111 //返回0 查询成功,返回1查询失败 112112 if (mysql_query(&mysql, "select * from user")) //执行SQL语句 113113 { 114114 printf("Query failed (%s)\n", mysql_error(&mysql)); 115115 return false; 116116 } 117117 else 118118 { 119119 printf("query success\n"); 120120 } 121121 res = mysql_store_result(&mysql); 122122 //打印数据行数 123123 printf("number of dataline returned: %lld\n", mysql_affected_rows(&mysql)); 124124 for (int i = 0; fd = mysql_fetch_field(res); i++) //获取字段名 125125 strcpy(field[i], fd->name); 126126 int j = mysql_num_fields(res); // 获取列数 127127 for (int i = 0; i < j; i++) //打印字段 128128 printf("%10s\t", field[i]); 129129 printf("\n"); 130130 while (column = mysql_fetch_row(res)) 131131 { 132132 for (int i = 0; i < j; i++) 133133 printf("%10s\t", column[i]); 134134 printf("\n"); 135135 } 136136 return true; 137137 } 138138 //插入数据 139139 bool InsertData() 140140 { 141141 sprintf(query, "insert into user values (6, 'Lilei', '123','lilei23@sina.cn');"); //可以想办法实现手动在控制台手动输入指令 142142 if (mysql_query(&mysql, query)) //执行SQL语句 143143 { 144144 printf("Query failed (%s)\n", mysql_error(&mysql)); //可以检查输入的信息是否有错误,比如输入的类型和字段的类型是否匹配 145145 return false; 146146 } 147147 else 148148 { 149149 printf("Insert success\n"); 150150 return true; 151151 } 152152 } 153153 //修改数据 154154 bool ModifyData() 155155 { 156156 sprintf(query, "update user set email='lilei325@163.com' where name='Lilei'"); 157157 if (mysql_query(&mysql, query)) //执行SQL语句 158158 { 159159 printf("Query failed (%s)\n", mysql_error(&mysql)); 160160 return false; 161161 } 162162 else 163163 { 164164 printf("Modify success\n"); 165165 return true; 166166 } 167167 } 168168 //删除数据 169169 bool DeleteData() 170170 { 171171 /*sprintf(query, "delete from user where id=6");*/ 172172 char query[100]; 173173 printf("please input the sql:\n"); 174174 gets_s(query); //这里手动输入sql语句 175175 if (mysql_query(&mysql, query)) //执行SQL语句 176176 { 177177 printf("Query failed (%s)\n", mysql_error(&mysql)); 178178 return false; 179179 } 180180 else 181181 { 182182 printf("Delete success\n"); 183183 return true; 184184 } 185185 }
C++对数据库中的数据做增删修改操作
执行结果:
