连接数据库的几个API
1. MYSQL *mysql_init(MYSQL *mysql);
MYSQL *mysql_init(NULL);
为mysql_real_connect()分配或初始化一个MYSQL对象,若mysql 为NULL,函数为其分配,初始化并返回一个新对象. 否则对象被初始化并返回该对象的地址.
返回值:一个被初始化了的MYSQL *handle,若内存不足返回NULL.
2.int mysql_options(MYSQL *mysql,enum mysql_option,const void *arg)
为连接设置一些连接项,必须在mysql_init()之后,mysql_real_connect()之前使用这个函数. 具体各个参数详见百度百科
3.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对象,主机名,用户名,密码,数据库名,端口,unix_sock,client_flag; 在调用该函数之前,必须先调用mysql_init()初始化MYSQL结构体.
4.int mysql_query(MYSQL *mysql,const *stmt_str);
int mysql_real_query(MYSQL *mysql,unsigned long length);
mysql_query执行由stmt_str指向的SQL语句,不能执行包含二进制的SQL语句(字符”\0”是二进制数据),但mysql_real_query()指定以分号分隔的多个SQL语句. 也可以调用mysql_real_connect()或mysql_set_server_option()指定以分号分隔的多个SQL语句.
返回值:SQL语句执行成功返回0,出错返回非0;
MYSQL_RES *mysql_use_result(MYSQL *mysql);
MYSQL_RES *mysql_store_result(MYSQL *mysql);
在调用mysql_query()或mysql_real_query()之后,必须调用mysql_free_result()释放结果集.初始化一个结果检索,但是并不像mysql_store_result()那样把结果集读到client,而是通过mysql_fetch_row()进行逐行检索,直到返回一个NULL. 直接从server读取,节省时间和空间.
返回值:成功返回一个MYSQL_RES结构体,出错返回NULL
5.int mysql_next_result(MYSQL *mysql);
该函数用来在由多个SQL语句构成的单独语句字符串时执行,在每次调用该函数之前,一定要使用mysql_use_result()释放当前语句的结果集.
6.MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
检索结果集中的下一行.
7.int mysql_num_fields(MYSQL_RES *result);
每行的值的个数可由mysql_num_fields(result)获知,如果row保存mysql_fetch_row()的返回值,则指向值的指针是row[0] to row[mysql_num_fields(result)-1];
8.void mysql_close(MYSQL *mysql);
关闭先前打开的连接,同时也释放由mysql指向的连接handle,若handle是由mysql_init() or mysql_connect()分配的.
代码如下:
mysql.h
#pragma once //这是一个比较常用的C/C++杂注,只要在头文件中的最开始加入这条杂注,就能保证头文件只被编译一次.
#include<string>
#include<mysql/mysql.h>
class MySql
{
public:
//构造函数用来初始化mysql和连接数据库
MySql(const std::string iP,const std::string name,const std::string passwd,const std::string database);
//析构函数用来做数据库的善后处理
~MySql();
//对数据库进行sql操作
bool operate(const std::string &operation);
//获取行
MYSQL_ROW getRow(void);
//获取列数
int getColNum(void); //得到每行的列数.
void freeResult(void); //
void print_result(void); //打印查询结果
bool InsertData(const std::string &operation); //插入数据
bool ModifyData(const std::string &operation); //修改数据
bool DeleteData(const std::string &operation); //删除数据
//释放保存在该连接的操作
private:
std::string server_ip; //数据库地址
std::string user_name; //用户名
std::string password; //用户密码
std::string database_name; //数据库名
private:
MYSQL *mysql_conn;
MYSQL_RES *mysql_res;
MYSQL_ROW mysql_row;
};
mysql.cpp
#include<iostream>
#include<string>
#include<mysql/mysql.h>
#include"mysql.h"
#include<stdio.h>
using namespace std;
MySql::MySql(const std::string ip,const std::string name,const std::string passwd,const std::string database)
{
server_ip=ip;
user_name=name;
password=passwd;
database_name=database;
//初始化mysql
mysql_conn=mysql_init(NULL);
//连接mysql
if(!mysql_real_connect(mysql_conn,server_ip.c_str(),user_name.c_str(),password.c_str(),database_name.c_str(),0,NULL,0)) //后面三个参数分别是port,unix_socket,client_flag.
{
std::cout<<"mysql连接失败"<<std::endl;
exit(1);
}else{
cout <<"mysql连接成功"<<endl;
}
}
//操作函数
bool MySql::operate(const std::string &operation)
{
if(mysql_query(mysql_conn,operation.c_str()))
{
std::cout<<"mysql操作失败"<<std::endl;
return false;
}
//将操作结果存储在结果集
mysql_res=mysql_use_result(mysql_conn);
mysql_free_result(mysql_res);
return true;
}
MYSQL_ROW MySql::getRow(void)
{
return mysql_fetch_row(mysql_res);
}
int MySql::getColNum(void)
{
return mysql_num_fields(mysql_res);
}
void MySql::print_result(void)
{
//获得每行的字段数
int num=mysql_num_fields(mysql_res);
//循环读取所有的行
while((mysql_row=mysql_fetch_row(mysql_res))!=NULL){
//将每行字段都读出来.
for(int i=0;i<num;i++){
cout << mysql_row[i]<<" ";
}
cout << endl;
}
}
bool MySql::InsertData(const std::string &operation)
{
if(mysql_query(mysql_conn,operation.c_str())){
cout << "mysql操作失败!"<<endl;
exit(1);
}else{
cout << "mysql连接成功"<<endl;
}
/*mysql_res=mysql_use_result(mysql_conn);
mysql_free_result(mysql_res);*/
}
bool MySql::ModifyData(const std::string &operation){
if(mysql_query(mysql_conn,operation.c_str())){
cout << "mysql操作失败"<<endl;
exit(1);
}else{
cout << "mysql连接成功"<<endl;
}
}
bool MySql::DeleteData(const std::string &operation){
if(mysql_query(mysql_conn,operation.c_str())){
cout <<"mysql操作失败"<<endl;
exit(1);
}else{
cout << "mysql连接成功"<<endl;
}
}
MySql::~MySql()
{
//释放存储结果
mysql_free_result(mysql_res);
//关闭mysql连接
mysql_close(mysql_conn);
cout << "数据库关闭成功"<<endl;
}
int main(int argc,char *argv[])
{
MySql mysql("127.0.0.1","root","429256","zuoye3");
//mysql.operate("select * from orders");
//mysql.print_result();
// mysql.InsertData("insert into yang values(NULL,'yang',21)");
//mysql.ModifyData("update yang set name='feifei' where id=1");
mysql.DeleteData("delete from yang where id=2");
return 0;
}