//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; }