C/C++连接MYSQL数据库的思路都是将MySQL官方提供的工具加入编译器的库或路径(至少是Dev-C++和VS是这样)
那这些工具在哪儿呢?
它们在你MYSQL安装目录的MySQL Server文件夹下的"include"文件夹和"lib"文件夹中
那要怎么把它们加入编译器呢?作者下面就以Dev-C++的添加方法作为样本做一个详细介绍!
环境配置:
首先打开Dev-C++,点击其窗口栏中的"Tools"(工具),再点击其中的"Compiler options"(编译器选项)
然后在打开窗口的第二个大框中添加字符串" -lmysql",像这样
然后点击上面的"Directories"(索引)选项,之后点击里边的"Libraries"(库)选项,然后下面有这样一个添加的小按钮,点击进入文件浏览器,在搜索框中输入G:\MySQL\lib点击确定,之后点击它下面的"add"(添加)按钮
然后跳转到隔壁"C Includes",以同样的方法添加一个路径G:\MySQL\include
之后要不嫌麻烦可以顺带把隔壁的"C++ Includes"一道配了,这样用C++就也能连接MYSQL了
然后呢,还有最后一步操作:将之前添加路径时用到的"lib"文件夹下的“libmysql.dll”文件复制粘贴到系统根目录(“C:\Windows”)下,这样整个环境配置工作就算是完整落幕了。
以上操作我也是借鉴了他人的博客:C/C++连接MYSQL(巨详)
接着就是连接步骤:
C/C++连接MYSQL思路:
一、初始化数据库连接句柄
二、连接数据库
三、设置字符集,防止发生乱码
四、设置操作命令
五、设置结果集接收返回结果(并输出)
六、关闭结果集、断开连接
连接的过程中遇到的问题:
1、动态库问题
在编译之前一定要记得将libmysql.dll动态库复制粘贴到系统根目录(“C:\Windows”)下。
2、连接时函数参数问题
MYSQL *mysql_real_connect(
MYSQL *mysql, //指定现有 MYSQL结构的地址。在调用之前 mysql_real_connect(),先调用 mysql_init()初始化MYSQL结构
const char *host, //值host可以是主机名或 IP 地址、如果host是NULL 或字符串"localhost",则假定连接到本地主机
const char *user, //该user参数包含用户的 MySQL 登录 ID。如果user是 NULL或空字符串 "",则假定为当前用户
const char *passwd,
const char *db, //db是数据库名称
unsigned int port, //如果port不为 0,则该值用作 TCP/IP 连接的端口号。请注意, host参数决定了连接的类型。
const char *unix_socket,//如果unix_socket不是 NULL,则该字符串指定要使用的套接字或命名管道。
unsigned long client_flag)//的值client_flag通常为 0
在连接时一定要记得将mysql_real_connect函数的参数写对,我出现问题是因为我电脑中搞了两个MySQL然后在安装第二个MySQL的时候为了避免端口冲突我将默认端口3306改成了3308,还有就是因为两个数据库的密码不一样让我搞混了很多次以至于老是连接失败。
3、环境变量问题
因为我安装了两个MySQL然后我再编程时连接的确定第二个MySQL的数据库,然而第一个MySQL的/bin路径又在第二MySQL前面以至于我的代码移植连接不上第二个MySQL,后面将第一个路径删了最终得以成功。
代码如下:
#include <stdio.h>
#include <mysql.h>
int main() {
char host[10] = "localhost"; //IP
char user[5] = "root"; //用户
char password[12] = "xxxxxx"; //密码
char database[6] = "mysql"; //连接的数据库名称数据库
int port=3308; //连接的端口号 默认为3306,我的为3308
MYSQL* conn; //设置数据库连接句柄
conn = mysql_init(NULL); //初始化连接句柄
if(!conn){
puts("初始化失败!");
return EXIT_FAILURE;
}
conn = mysql_real_connect(conn,host,user,password,database,port,NULL,0);//连接数据库
if(conn) puts("数据库连接成功!"); //判断数据库是否连接成功
else{
printf("数据库连接失败,错误:%s",mysql_error(conn));
mysql_close(conn);
return EXIT_FAILURE;
}
//字符编码,解决乱码
if(mysql_set_character_set(conn,"GBK")) puts("字符集设置错误!");
else puts("字符集设置成功!");
char query[21] = "select * from course";
if(mysql_query(conn,query)) printf("查询失败,错误:%s\n",mysql_error(conn));
else puts("查询成功!");
MYSQL_RES* res;
res = mysql_use_result(conn);//获取结果
MYSQL_ROW row;//设置行结果容器
while(row = mysql_fetch_row(res)){//获取行结果
for(int t = 0;t < mysql_num_fields(res);t++)//将行结果分列输出
printf("%s\t", row[t]);
printf("\n");
}
mysql_free_result(res);//释放结果集
mysql_close(conn);//关闭数据库连接
return 0;
}