利用C++对mysql数据库进行操作

目前刚学习了一点mysql的知识,自己编了一个简易的与mysql连接并进行一些操作的C++程序。

具体讲解都写在了程序的注释里:


#include <winsock.h>
#include <mysql.h>
#pragma comment(lib,"libmySQL.lib")  //要加不然会编译出错
#include "stdio.h"
#include "string.h"
#include<iostream>
using namespace std;
 
struct conn_info {
	char *host;
	char *user;
	char *password;
	char *db;
};

struct student
{
	char name[10];
	char nu[10];
	struct student *next;
};

class Mysql
{
public:
/********************************连接数据库*****************************************************/
	MYSQL* mysql_connect(conn_info con){
		MYSQL* mysql=mysql_init(NULL);//mysql初始化函数,实例化一个新的对象(NULL为新的对象,否则为初始化以创建的对象)
		if(!mysql_real_connect(mysql,con.host,con.user,con.password,con.db,3306,NULL,0)){//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 long client_flag)
			//上面的函数为,与mysql进行连接
			cout<<"connection error";
			exit(1);
		}
		return mysql;//返回实例化的对象
	}

/****************************************数据库操作函数*******************************************************/
	void mysql_operation(MYSQL* mysql,char *sql_op)
	{
		if(mysql_query(mysql,sql_op))//mysql_query()函数为对mysql进行操作,第一个参数为刚才实例化的对象,第二个位需要进行的操作
		{ 
			printf("MySQL query error : %s/n", mysql_error(mysql));  //需要加上这个,因为这个是操作失败时返回显示
			getchar();
		 	exit(1);
		}	
	}

/*******************************查询函数***********************************************************/
	MYSQL_RES* mysql_find(MYSQL* mysql,const char *table,MYSQL_RES* res){
		char cmd[100];
		strcpy(cmd,"select * from ");
		strcat(cmd,table);		//拼接函数

		cout<<cmd<<endl;

		mysql_free_result(res);
		mysql_operation(mysql,cmd);
		return mysql_store_result(mysql);//查询的结果,用mysql_store_result函数后接mysql_affected_rows()可以返回查询次数,而用mysql_use_result()则不行
	}

/*****************************************插入数据*********************************************************************/
	void mysql_insert(MYSQL* mysql,struct student *p)//需要输入数据为:已经创建好的对象mysql和结构体的指针头部*p
	{
		char cmd[100];

		strcpy(cmd,"insert test values(\"");
		strcat(cmd,p->name);
		strcat(cmd,"\",\"");
		strcat(cmd,p->nu);
		strcat(cmd,"\")");

		cout<<cmd<<endl;

		mysql_operation(mysql,cmd);
	}

/*****************************************显示函数*********************************************************************/
	void mysql_show(MYSQL_RES* res)//用于存储查询返回的数据,但这个数据还不能显示,需要进行转换
	{
		MYSQL_ROW row;
		while (( row = mysql_fetch_row(res) ) != NULL)//	row = mysql_fetch_row(res);进行数据的转换,需要循环转换,具体看程序最后的解释
		{
			cout<<row[0]<<"  "<<row[1]<<"  "<<endl;//显示的行数,注意此处表格中只有两列,故row也只有2列,若写多列会出错
		 
		}
	}

/******************************************精确查询函数************************************************************************/
	void mysql_found(MYSQL* mysql,const char *table,MYSQL_RES* res,int i,const char *str1)//因为row为const char *类型,故需要str1也为此类型,因为要两者进行比较,i为需要比较哪列
	{
		MYSQL_ROW row;
		res = mysql_find(mysql,"test",res);

		while (( row = mysql_fetch_row(res) ) != NULL)//	row = mysql_fetch_row(res);进行数据的转换,需要循环转换,具体看程序最后的解释
		{
			if( strcmp(row[i],str1) == 0) //判断是否相等
			{
				cout<<"要查找的为:"<<endl;
				cout<<row[0]<<"  "<<row[1]<<"  "<<endl;
				break;
			}
		}
	}

/***************************************************删除函数(删除某一行)***************************************************************/
	void mysql_del(MYSQL* mysql,const char *table,const char *row,const char *str0)
	{
		char cmd[100];

		strcpy(cmd,"delete from ");//Mysql 删除语句为 delete from 表格名 where 列名 like 检索条件
		strcat(cmd,table);
		strcat(cmd," where ");
		strcat(cmd,row);
		strcat(cmd," like ");
		strcat(cmd,"\"");
		strcat(cmd,str0);
		strcat(cmd,"\"");
	//	cout<<cmd<<endl;

		mysql_operation(mysql,cmd);
	}

/**************************************************更改函数****************************************************************************/
	void mysql_change(MYSQL* mysql,const char *table,const char *row1,const char *row1_data,const char *row2,const char *row2_data)
	{					//(对象,表格名,列名(用于修改的列),该列数据(用于修改的数据),列名(用于查找),该列数据(用于查找))
		char cmd[100];

		strcpy(cmd,"update ");
		strcat(cmd,table);
		strcat(cmd," set ");
		strcat(cmd,row1);
		strcat(cmd,"=\"");
		strcat(cmd,row1_data);
		strcat(cmd,"\" where ");
		strcat(cmd,row2);
		strcat(cmd,"=\"");
		strcat(cmd,row2_data);
		strcat(cmd,"\"");

		cout<<cmd<<endl;

		mysql_operation(mysql,cmd);
	}

/***************************************上一次查询、删除、添加的操作次数*****************************************************/
	const mysql_number(MYSQL* mysql)
	{
		const length = mysql_affected_rows(mysql);//记录刚才进行查询的次数
		return length;
	}
};

void main(){
	MYSQL* conn;//用于实例化的新的对象
	MYSQL_RES* res;//用于存储查询返回的数据,但这个数据还不能显示,需要进行转换
//	MYSQL_ROW row;//这个是转换完的数据,可以进行显示

	struct conn_info info;
	Mysql mysql;
	
	res = NULL;//要先初始化,否则会报错

	info.host="localhost";
	info.user="root";
	info.password="123456";
	info.db="mysql";//我的数据库名字

	conn = mysql.mysql_connect(info); //初始化,包括创建对象和连接mysql
 		
	struct student *p;
	char str1[6] = "\",\"";
	char str2[6] = "\")";
	p = (struct student *)malloc( sizeof(struct student) );
	p->next = NULL;
	strcpy(p->name,"zkw");
	strcpy(p->nu,"24");
	
	mysql.mysql_insert(conn,p);
	res = mysql.mysql_find(conn,"test",res);//进行操作,此处为查询数据库名为mysql中的test表格数据
	const length = mysql.mysql_number(conn);//记录刚才进行查询的次数
	cout<<length<<endl;
	mysql.mysql_show(res);//显示函数
	mysql.mysql_found(conn,"test",res,0,"zkw");//查询函数,分别为(res,需要比较的列数,以及需要查询的字符串)
	mysql.mysql_del(conn,"test","name","zk");//删除函数,分别为(对象,需要查询的表格,需要查询的列名,需要查询的具体数据)
	mysql.mysql_change(conn,"test","name","zk","id","24");

	getchar();
	mysql_free_result(res);
	mysql_close(conn);
}


//关于row 和 res 的理解,可以大致理解为,res通过res = mysql_store_result(mysql)来把数据库中的数据存放至一个缓存区
//而后row通过row = mysql_fetch_row(res),将缓存中的数据读取出来,每次读取一行,故要全部显示出来,需要循环显示,直到返回值为NULL

可能有错误,请见谅,新手开车,翻车很正常。

猜你喜欢

转载自blog.csdn.net/qq_37358422/article/details/81033384