MySql 版本:MySql-5.6.16-winx64
VS版本:visual stadio 2010(以上)
1 首先确定一下MySql的安装路径
Mysql_install_path = E:\wangdao\MySql\mysql-5.6.19-win32\mysql-5.6.19-winx64
我们只关心该目录下的include和lib两个文件夹。
2.打开vs2010创建一个控制台项目 TestMySQL
①右键项目 ->属性->配置属性->C/C++ -> 常规 –>附件包含目录
编辑附加包含目录,将mysql_install_path目录下的include添加进来。
②新建一个C源文件。
输入:
#include <WinSock2.h>
#include “mysql.h”
#include <stdio.h>
#include <stdlib.h>
Int main()
{
System(“pause”);
Return 0 ;
}
保存该源文件。
编译连接。如果编译通过会在项目目录下产生一个debug目录(里面包含可执行程序)。该目录正是我们所需要的。
③将mysql_install_path目录下lib目录下的 libmysql.lib和libmysql.dll拷贝到上一步产生的debug目录下(libmysql.dll要和可执行程序在同一个目录下)。
右键项目->属性->配置属性->VC++目录 -> 库目录。
编辑库目录,将源文件编译产生的debug目录的路径添加进来。
④ 右键项目->属性->配置属性->连接器->输入->附加依赖项。
编辑附加依赖项,添加libmysql.lib
然后修改源程序
#include <WinSock2.h>
#include "mysql.h"
#include <stdio.h>
#include <stdlib.h>
#define HOST "127.0.0.1"
#define PORT 3306
#define USR "root"
#define PWD "123456"
#define DB "test"
#define TABLE1 "student"
#define TABLE2 "account"
int main()
{
MYSQL *con;
// char *myhost="127.0.0.1";
// char *myusr="root";
// char *mypwd="123456";
// char *mydb="test";
// char *mytable1="student";
// char *mytable2="account";
// int myport=3306;
MYSQL_RES *res;
MYSQL_ROW row;
char name[100]="liubin";
char sql_line[1024]="";
int rt,index_field,count;
con = mysql_init((MYSQL *)0);
if(!mysql_real_connect(con,HOST,USR,PWD,DB,PORT,NULL,0)) //mysql_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接
{
printf("mysql connect failed !\n"); //连接失败返回NULL
system("pause");
exit(-1);
}
printf("connect successful!\n");
//select * from student;
sprintf(sql_line,"select * from %s where usr_name='%s' ",TABLE2,name); //使用语句数组赋值 table2 table2是表的名字
rt=mysql_real_query(con,sql_line,strlen(sql_line)); // 通过中间的的数组中的查询语句进行查询 参数 :MYSQL *mysql, const char *query, unsigned long length
if (rt) //
{
printf("mysql_real_query error !\n");
system("pause");
exit(-1);
}
else
{
res=mysql_store_result(con); //记录检索到的信息
//printf("Insert successful!\n");
//printf("Delete successful!\n");
//printf("Update successful!\n");
//count=0;
// row=mysql_fetch_row(res);
// printf("%s",row[1]);
while(row = mysql_fetch_row(res))
{
//printf("|");
for(index_field =0; index_field<mysql_num_fields(res);index_field++)
{
printf("%-10s|\t",row[index_field]);
}
printf("\n------------------------------------------------------------------------------\n");
//count++;
}
//printf("total results : %d \n",count);
mysql_free_result(res);
}
mysql_close(con);
system("pause");
return 0;
}
该程序是一个简单的链接数据库查询程序。
下面是一些报错情况解决, 上面教程兼容32系统, 但在64位系统下需要修改一些东西
64位系统通过上面的配置依然会报错:
报错会出 错误如下:
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_close@4,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_fetch_row@4,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_store_result@4,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_query@8,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_real_connect@32,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_options@12,该符号在函数 _main 中被引用
1>test.obj : error LNK2019: 无法解析的外部符号 _mysql_init@4,该符号在函数 _main 中被引用
解决方案:
第一步:
项目->属性->vc++目录。 在"包含目录"中添加"E:\wangdao\MySql\mysql-5.6.19-win32\mysql-5.6.19-winx64\include"
若编译依然不通过,报错后 按照下面方法:
我使用的系统是win8x64,MySQL 64位的lib也是64位的接口。所以解决方法如下:
项目->属性->配置管理器 活动解决方案平台 (对话框右上角),win32处 下拉选新建,
出现一个新的对号框,在键入选择新平台中选择X64
然后F5运行一下 找到当前程序所在目录
会生成一个新文件夹叫 X64 ,里面有一个新的Debug文件夹 , 将libmysql.lib 和libsql.dll放到新生成文件夹的Debug下
然后重新运行程序 成功。
下面是一些程序用的函数或者变量的讲解:
真正的连接
定义MYSQL结构体变量
MYSQL *CON;
然后是初始化连接
con = mysql_init((MYSQL *)0);
然后是真正的连接数据库
mysql_real_connect(con "HOST", "USR", "PWD", "DB", "PORT", 0, NULL);
第一个参数不说了;第二个参数是数据库所在的主机地址;第三、四个参数是用户名、密码;第五个参数是要连接的数据库名称;第六个参数是端口号,可以指定也可以赋为0;第七个参数是指定连接的套接字,也不用管;第八个参数一般情况下都是0。
注意函数的返回值和PHP的不一样。连接成功返回0,否则返回非0。出错信息可以调用sql_error(MYSQL* )来查看。
定义sql语句(最后没有分号):
char sqlbuf[100] = "select * from student ";
sprintf(sql_line,"select * from %s ",TABLE1);
下面让MySQL执行sql语句:
rt=mysql_real_query(con,sql_line,strlen(sql_line));
该函数也是成功(即使没有查询到数据)返回0,失败返回非0。
查询到了数据后就是获取查询结果了,这里还要定义两个结构体:查询结果结构体和记录结构体(保存一条记录)
MYSQL_RES *res;
MYSQL_ROW row; // 本质上就是二维数组
获取查询结果
res = mysql_store_result(con);
获取每一条记录
while (row = mysql_fetch_row(res))
{
for(index_field =0; index_field<mysql_num_fields(res);index_field++)
{
printf("%-10s|\t",row[index_field]);
}
// 添加自己的存储查询结果代码
}
释放查询结果:
mysql_free_result(res);
关闭MySQL连接:
mysql_close(con);
如果是INSERT、UPDATE等非查询语句mysql_real_query()就可以结束了,因为没有结果可存。