• 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;
    }
  • 相关阅读:
    centOS操作磁盘(命令行)
    TCP学习记录
    公务员考试考什么
    从动物科学到乐队鼓手,腾讯技术小哥的开源人生
    HarmonyOS实战—实现相亲APP
    oracle 以某个字符拆分成多行
    微信小程序预览 word、excel、ppt、pdf 等文件
    微信小程序相关问题排查技巧
    html 保留空格
    (转载)currentColor 让 CSS 更简短
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/6059211.html
Copyright © 2020-2023  润新知