最近在看c++连接mysql的问题,网上众说纷纭,散而不精,在这里我整理一个比较全面的,详细的介绍mysql与C++连接的文章。(我用的是VS2012)
第一步,连接数据库前的一些配置,包括include文件夹、lib文件夹,libmysql.lib文件,以及libmysql.dll。
项目==》属性==》配置属性==》C/C++==》常规。在右边的附加包含目录中输入include的绝对路径。
然后,设置链接的库目录。在安装目录找到MySQL Sever 5.7(我的版本是5.7)下的lib文件夹,项目==》属性==》配置属性==》链接器==》常规。在右边的附加库目录中输入lib文件夹的路径,然后点击左边的输入,在输入右边的附加依赖项中添加libmysql.lib。
最后,将lib文件夹里的libmysql.dll文件复制到C:\WINDOWS\system32目录下。
以上的工作结束后,基本的配置就算完成了。
第二步,在文件中添加头文件,即:#include "mysql.h"
第三步,定义数据源指针并初始化,并设置字符集
语句如下:
<span style="font-size:14px;"><pre name="code" class="cpp">MYSQL *con;
con = mysql_init((MYSQL*) 0);
//mysql_init(con);也行
if(0==mysql_options(con,MYSQL_SET_CHARSET_NAME,"gbk"))//设置字符集
{
cout << "设置字符集成功\n\n" <<endl;
}</span>
第四步,连接数据库,使用mysql_real_connect()函数。
函数原型如下:MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned int client_flag)
参数说明:mysql就是数据源指针,host是主机,本机是“localhost”,user是登录数据库的用户名,passwd是密码,db是数据库,port是端口号(一般是0,TCP的端口是3396),unix_socket一般是NULL,client_flag通常是0。
代码如下:
<span style="font-size:14px;">if(!mysql_real_connect(con,dbip.c_str(),dbuser.c_str(),dbpasswd.c_str(),dbname.c_str(),3306,NULL,0))//连接数据库
{
cout << "not connect mysql" << endl;
}else
{
cout << "welcome to mysql\n\n\n";
}</span>
第五步,连接好后如何执行SQL语句,用函数mysql_real_query()查询。
函数原型:int mysql_real_query(MYSQL *mysql, const char *query, unsigned int length)
参数说明:
执行由query指向的SQL查询,它应该是一个length个字节的字符串。查询必须由一个单个的SQL语句组成。你不应该在语句后增加一个终止的分号(“;”)或\g。
对于包含二进制数据的查询,你必须使用mysql_real_query()而不是mysql_query(),因为二进制代码数据可能包含“\0”字符,而且,mysql_real_query()比mysql_query()更快,因为它对查询字符串调用strlen()。如果查询成功,零。如果发生一个错误,非零。
代码如下:
<span style="font-size:14px;">string sqlstr2="select * from "+tablename;
mysql_real_query(con,sqlstr2.c_str(),sqlstr2.length());</span>
事实上,update/insert/alter等基本的SQL语句都是用这两个函数来执行的。
第六步:获取查询结果。
1) 在使用了mysql_real_query进行了Select查询之后,可以用mysql_store_result来收集查询结果,用完后记得用mysql_free_result来释放内存:
MYSQL_RES *mysql_store_result(MYSQL *mysql)
代码如下:
<span style="font-size:14px;"><span style="font-size:14px;">MYSQL_RES *res;
res=mysql_store_result(con);</span></span>
2)获取查询结果后显示字段
用mysql_store_result收集了查询结果后,可用mysql_fetch_fields来收集所有字段
代码如下:
<span style="font-size:14px;">MYSQL_FIELD *field=NULL;
unsigned int fieldcount=mysql_num_fields(res); //获取字段数
field=mysql_fetch_fields(res);
for(int i=0;i<fieldcount;i++)//输出字段名
{
cout<<field[i].name<<"\t";
}
cout<<endl;</span>
3)显示查询到的数据
用mysql_store_result收集了查询结果后,可用mysql_fetch_row函数来获得结果的每一行
代码如下:
<span style="font-size:14px;"> MYSQL_ROW row=NULL;
while(row=mysql_fetch_row(res))
{
string strtmp;
for(int i=0;i<fieldcount;i++)
{
if(row[i]!=NULL)
{
strtmp=row[i];
cout<<strtmp<<"\t";
}
else cout<<"NULL\t";
}
cout<<endl;
} </span>
以上就是所有的过程,整体代码如下:
<span style="font-size:14px;"><pre name="code" class="cpp">#include <iostream>
#include "mysql.h"
#include <string>
#include <iomanip>
using namespace std;
const int WIDTH=10;
void main()
{
MYSQL * con;
MYSQL_RES *res;
string dbuser="root";
string dbpasswd="1234";
string dbip="localhost";
string dbname="stumanager";
string tablename="stumessage";
string *query=NULL;
con = mysql_init((MYSQL*) 0);
//mysql_init(con);也行
if(0==mysql_options(con,MYSQL_SET_CHARSET_NAME,"gbk"))//设置字符集
{
cout << "设置字符集成功\n\n" <<endl;
}
if(!mysql_real_connect(con,dbip.c_str(),dbuser.c_str(),dbpasswd.c_str(),dbname.c_str(),3306,NULL,0))//连接数据库
{
cout << "not connect mysql" << endl;
}else
{
cout << "welcome to mysql\n\n\n";
}
string sqlstr2="select * from "+tablename;
mysql_real_query(con,sqlstr2.c_str(),sqlstr2.length());
res=mysql_store_result(con); //获取资源
MYSQL_FIELD *field=NULL; //字段
MYSQL_ROW row=NULL; //记录
// int rowcount=mysql_num_rows(res); //获取记录数
unsigned int fieldcount=mysql_num_fields(res); //获取字段数
//cout << rowcount << endl;
field=mysql_fetch_fields(res);
for(int i=0;i<fieldcount;i++)//输出字段名
{
cout<<setiosflags(ios::left)<<setw(WIDTH)<<field[i].name;
}
cout<<endl;
while(row=mysql_fetch_row(res))
{
string strtmp;
for(int i=0;i<fieldcount;i++)
{
if(row[i]!=NULL)
{
strtmp=row[i];
cout<<setiosflags(ios::left)<<setw(WIDTH)<<strtmp;
}
else cout<<setiosflags(ios::left)<<setw(WIDTH)<<"NULL";
}
cout<<endl;
}
mysql_free_result(res);
mysql_close(con);
mysql_server_end();
mysql_library_end();
}</span>
运行结果如下:
参考网址:http://dev.mysql.com/doc/refman/5.7/en/c-api.html