目前刚学习了一点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
可能有错误,请见谅,新手开车,翻车很正常。