最近在看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>






运行结果如下:



cpp连接mysql ubuntu c++连接mysql数据库_API

参考网址:http://dev.mysql.com/doc/refman/5.7/en/c-api.html