QT 数据库编程四

//vmysql.cpp
#include "vmysql.h"

#include <QMessageBox>

Vmysql::Vmysql()
{
    mysql_init(&mysql1);
    connection=NULL;
    memset(errorbuf,0,sizeof(errorbuf));
}

Vmysql::~Vmysql()
{
}

/*连接数据库*/
int Vmysql::sql_connect(const char *hostname, const char *username, const char *passwd, const char *dbname)
{
    if(hostname==NULL||username==NULL||passwd==NULL||dbname==NULL)
    {
        memset(errorbuf,0,sizeof(errorbuf));
        strcpy(errorbuf,"sql_connect() 参数不可以为空!");
        /*这里没有父窗口,所以第一个参数为0*/
        //QMessageBox::critical(0,"错误信息","sql_connect() 参数不可以为空!");
        return -1;
    }
    connection=mysql_real_connect(&mysql1,hostname,username,passwd,dbname,0,0,0);
    if(connection==NULL)
    {
        memset(errorbuf,0,sizeof(errorbuf));
        strcpy(errorbuf,mysql_error(&mysql1));
        //QMessageBox::critical(0,"错误信息",mysql_error(&mysql1));
        return -1;
    }
    /*连接成功,设置字符集*/
    if(mysql_query(connection,"SET NAMES utf8")!=0)
    {
        memset(errorbuf,0,sizeof(errorbuf));
        strcpy(errorbuf,mysql_error(&mysql1));
        return -1;
    }
    return 0;
}

/*断开数据库连接*/
void Vmysql::sql_disconnect()
{
    if(connection)
    {
        mysql_close(connection);
        connection=NULL;
    }
}

/*执行SQL更新*/
int Vmysql::sql_exec(const char *strsql)
{
    if(strsql==NULL)
    {
        memset(errorbuf,0,sizeof(errorbuf));
        strcpy(errorbuf,"sql_exec() 参数不可以为空!");
        return -1;
    }
    if(mysql_query(connection,strsql)!=0)
    {
        memset(errorbuf,0,sizeof(errorbuf));
        strcpy(errorbuf,mysql_error(&mysql1));
        return -1;
    }
    return 0;
}

/*执行SQL查询*/
int Vmysql::sql_query(const char *strsql,QStandardItemModel **model)
{
    if(strsql==NULL||model==NULL)
    {
        memset(errorbuf,0,sizeof(errorbuf));
        strcpy(errorbuf,"sql_query() 参数不可以为空!");
        return -1;
    }
    if(mysql_query(connection,strsql)!=0)
    {
        memset(errorbuf,0,sizeof(errorbuf));
        strcpy(errorbuf,mysql_error(&mysql1));
        return -1;
    }
    /*获取结果集*/
    MYSQL_RES *result=mysql_store_result(connection);
    /*mysql_affected_rows(connection);返回当前数据集有多少行
     *  mysql_field_count(connection);返回当前数据集有多少列*/
    /*特别注意:mysql_affected_rows()或者mysql_field_count()方法必须在mysql_store_result()之后使用*/
    int rowcount = mysql_affected_rows(connection);
    int fieldcount=mysql_field_count(connection);
    if(result==NULL)
    {
        memset(errorbuf,0,sizeof(errorbuf));
        strcpy(errorbuf,mysql_error(&mysql1));
        return -1;
    }
    /*创建返回model*/
    /*创建一个rowcount行fieldcount列的model数据集;
     * 根据SQL语句返回的行列总数,动态的创建model*/
    QStandardItemModel *tmodel=new QStandardItemModel(rowcount,fieldcount);
    /*创建列数据*/
    MYSQL_FIELD *field=NULL;
    for(int i=0;i<fieldcount;i++)
    {
        field=mysql_fetch_field(result);
        /*设置第i列的列名,第一个参数是指第几列,第二个参数是个固定参数,第三个参数是列名*/
        tmodel->setHeaderData(i,Qt::Horizontal,field->name);
    }
    /*创建单元格数据*/
    MYSQL_ROW row=NULL;
    for(int i=0;i<rowcount;i++)
    {
        row=mysql_fetch_row(result);
        for(int j=0;j<fieldcount;j++)
        {
            /*设置model每个单元格的数据*/
            /*model->index(0,0,QModelIndex()),index()函数第一个参数表示第几行,第二个参数表示第几列,第三参数是固定写法*/
            tmodel->setData(tmodel->index(i,j,QModelIndex()),row[j]);
        }
    }
    *model=tmodel;
    /*释放mysql_store_result()函数分配的内存空间*/
    mysql_free_result(result);
    return 0;
}

/*错误信息*/
const char *Vmysql::ger_error()
{
    return this->errorbuf;
}
原文地址:https://www.cnblogs.com/zhanggaofeng/p/6059211.html