关闭

C++连接数据库

标签: mysql
382人阅读 评论(0) 收藏 举报

连接数据库的几个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;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:59808次
    • 积分:1675
    • 等级:
    • 排名:千里之外
    • 原创:109篇
    • 转载:0篇
    • 译文:0篇
    • 评论:16条
    最新评论