C++操作MySQL

一.准备

1.     头文件:#include "winsock.h"

                       #include "mysql.h"    

2.     库文件:libmysql.dll 和libmysql.lib

3.     调用库:#pragma comment(lib,"ws2_32")

                       #pragma comment (lib, "libmysql.lib")

4.      MYSQL m_mysql;    //MySQL对象

        MYSQL_RES *pRes;//结果集    

        MYSQL_ROW row; //行数据, return data as array of strings

二.常用函数

1.      intSTDCALLmysql_server_init(intargc,char**argv,char**groups);

描述

初始化libmysqld 库。

返回值

成功返回0,失败返回非0

inta=mysql_server_init (0,NULL,NULL);

2.     MYSQL*mysql_init(MYSQL*mysql);

描述

分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。

返回值

初始化的MYSQL*句柄。如果无足够内存以分配新的对象,返回NULL。

if(mysql_init(&m_mysql)==NULL)

3.     int mysql_options(MYSQL*mysql,enummysql_optionoption,constchar*arg);

描述

设置额外的连接选项,并影响连接的行为。可多次调用该函数来设置数个选项。

返回值

该函数成功时返回0。如果使用了未知选项,返回非0值。

mysql_options(&m_mysql,MYSQL_OPT_CONNECT_TIMEOUT,szBuf);//VC6.0

mysql_options(&m_mysql,MYSQL_SET_CHARSET_NAME,"utf8");  //VS2005

4.     MYSQL*mysql_real_connect(MYSQL*mysql,constchar*host,constchar*user,constchar*passwd,constchar*db,unsignedintport,constchar*unix_socket,unsignedlongclientflag);

描述

尝试与运行在主机上的MySQL数据库引擎建立连接。

返回值

如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同。

if(mysql_real_connect(&mysql,"192.168.1.175","root","232528","fjh_sql",3306,NULL,0))

5.      int  mysql_set_character_set(MYSQL*mysql,constchar*csname);

描述

该函数用于为当前连接设置默认的字符集。该函数的工作方式与SET NAMES语句类似

返回值

该函数0表示成功,非0值表示出现错误。

if(0!=mysql_set_character_set(&mysql,"utf8"))

6.     int mysql_query(MYSQL*mysql,constchar*q);

描述

向与指定的连接标识符关联的服务器中的当前活动数据库发送一条查询。查询“q”语句,然后执行该语句。

返回值

仅对 SELECT,SHOW,EXPLAIN 或 DESCRIBE 语句返回一个资源标识符,如果查询执行不正确则返回 FALSE。对于其它类型的 SQL 语句,mysql_query() 在执行成功时返回 TRUE,出错时返回 FALSE。

ASSERT(mysql_query(&mysql,"SET NAMES GBK")==0);  //设置输出字符的编码

7.     constchar*mysql_error(MYSQL*mysql);

描述

返回上一个 MySQL 操作产生的文本错误信息

返回值

本函数返回上一个 MySQL 函数的错误文本,如果没有出错则返回 空字符串

strText.Format("Error: %s",mysql_error(&m_mysql));

8.     MYSQL_RES*mysql_store_result(MYSQL*mysql);

描述

将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。

返回值

如果查询未返回结果集,将返回Null指针(例如,如果查询是INSERT语句)。如果读取结果集失败,还会返回Null指针

MYSQL_RES  *pRes=mysql_store_result(&m_mysql);

9.     voidmysql_free_result(MYSQL_RES*result);

描述

释放结果内存。

返回值

mysql_free_result(pRes);                 

10. unsignedintmysql_num_fields(MYSQL_RES*res);

描述

返回结果集中字段的数。

返回值

成功返回结果集中字段的数。如果失败,则返回 false。

intnCol=mysql_num_fields(pRes);             

11. MYSQL_ROWmysql_fetch_row(MYSQL_RES*result);

描述

在mysql_store_result()之后使用时,检索一个结果集合的下一行。

返回值

如果没有更多的行可检索时,mysql_fetch_row()返回NULL。

while(MYSQL_ROW row=mysql_fetch_row(pRes))      

12. unsignedlong *mysql_fetch_lengths(MYSQL_RES*result);

描述

取得一行中每个字段的内容的长度。

返回值

若成功,则该函数返回一个数字数组,若出错或没有其他的行,则返回 false。

UINT*pRowLen=(UINT*)mysql_fetch_lengths(pRes);

13. voidmysql_close(MYSQL*sock);

描述

关闭 MySQL 连接

返回值

mysql_close(&m_mysql);

14. SELECT LAST_INSERT_ID()

描述

替代mysql_insert_id()函数,在查询语句内部使用。自动返回最后一个INSERT查询中AUTO_INCREMENT列设置的第一个表发生的结果集。

返回值

将最后返回的结果集保存到MySQL对象。

mysql_query(&m_mysql,"SELECT LAST_INSERT_ID()")

三.连接

1.     调用mysql_server_init()初始化libmysqld 库;

2.     调用mysql_init()初始化MYSQL对象;

3.     调用mysql_options()设置字符集;

4.     调用mysql_real_connect()连接数据库。

四.插入

1.   调用mysql_query()执行拼凑好的插入语句;

2.     调用mysql_query(&m_mysql,"SELECT LAST_INSERT_ID()")!=0)自动返回最后一个INSERT查询中 AUTO_INCREMENT列设置的第一个表发生的值。

五.修改

1.     调用mysql_query()执行拼凑好的修改语句

六.查询

1.     调用mysql_real_query()执行拼凑好的查询语句;

2.     调用mysql_store_result()将查询到的数据返回到结果集pRes中;

3.     调用mysql_num_fields()返回字段总数;

4.     调用(UINT)pRes->row_count返回总行数 ;

5.     调用mysql_fetch_row(pRes)返回行数据row;使用while循环,直到结果集为空(没有数据),结果集自动增加

6.     调用mysql_fetch_lengths()返回列名长度;

7.     通过row[nCol]查询列数据;nCol为需要查询的列数

8.     调用mysql_free_result()释放结果集。

七.删除

1.     调用mysql_query()执行拼凑好的删除语句。

八.关闭

1.     调用mysql_close关闭关闭 MySQL 连接。

九.实例

void SelectMySQLDB()
{
	MYSQL m_mysql;

	mysql_library_init(0, NULL, NULL);

	if (mysql_init(&m_mysql) == NULL)
	{
		return ;
	}

	mysql_options(&m_mysql, MYSQL_SET_CHARSET_NAME, "utf8");   //VS2005

	if(NULL == mysql_real_connect(&m_mysql, "127.0.0.1", "root", "888666", "fjh_test", 3308, NULL, 0))
	{
		CString strText;
		strText.Format("不能连接到数据库,请检查连接!");                
		AfxMessageBox(strText);
	}
	else
	{
		TRACE("连接成功");
	}

//普通查询
	if ( NULL != mysql_query(&m_mysql, "SELECT * FROM USER"))
	{
		MessageBox("查找失败");
	}
	

//存储过程查询
// 	if ( NULL != mysql_query(&m_mysql, "CALL sp_selectUserInfo()"))
// 	{
// 		MessageBox("查找失败");
// 	}

// 	if ( NULL != mysql_query(&m_mysql, "CALL sp_selectPasswordByUserName('fjh')"))
// 	{
// 		MessageBox("查找失败");
// 	}

// 	if ( NULL != mysql_query(&m_mysql, "CALL sp_selectLogin('fjh', '123', @total)"))
// 	{
// 		MessageBox("查找失败");
// 	}

//视图查询
// 	if (NULL != mysql_query(&m_mysql, "SELECT * FROM view_userName WHERE userName='fjh'"))
// 	{
// 		MessageBox("视图查找失败");
// 	}

// 	if (NULL != mysql_query(&m_mysql, "SELECT * FROM view_userInfo WHERE userName='fjh'"))
// 	{
// 		MessageBox("视图查找失败");
// 	}


	MYSQL_ROW row;
	MYSQL_RES *pRes;
	
	pRes = mysql_store_result(&m_mysql);		//将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。		
	if (pRes == NULL)							//0行
	{
		mysql_free_result(pRes);				//释放结果内存。
	}

	int  nRow		= 0;
	int  nCol		= mysql_num_fields(pRes);	//字段总数
	UINT unRowCount = (UINT)pRes->row_count;	//行总数

	int		n		= 0;
	CString strID   = "";
	CString strName = "";
	CString strPsw  = "";


	while (row = mysql_fetch_row(pRes))				//row相当于字符串数组类型,行数据
	{
		n		= 0;
 		strID	= row[n++];
 		strName	= row[n++];
 		strPsw	= row[n++];
	}
	
	mysql_close(&m_mysql);

	((CEdit *)GetDlgItem(IDC_EDIT_SQL_DATA_ID))->SetWindowText(strID);
	((CEdit *)GetDlgItem(IDC_EDIT_SQL_DATA_NAME))->SetWindowText(strName);
	((CEdit *)GetDlgItem(IDC_EDIT_SQL_DATA_PSW))->SetWindowText(strPsw);
}


你可能感兴趣的:(C++,数据库,VS2005)