2024-11-25 17:15:44 +08:00

333 lines
8.2 KiB
C++

#include "mysqldatabase.h"
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
#include <QSqlError>
#include <QSqlDriver>
#include <QSqlRecord>
#include <QSqlField>
MySqlDataBase::MySqlDataBase(QWidget *parent)
: QWidget(parent)
{
}
MySqlDataBase::~MySqlDataBase()
{
}
/*********打开数据库***************/
bool MySqlDataBase::openDB(QString name,const QString &type)
{
//首先判断是否该数据库
if(QSqlDatabase::contains(name))
{
m_database = QSqlDatabase::database(name);
}
else
{
/***根据type类型添加数据库驱动****/
m_database = QSqlDatabase::addDatabase(type,name);
/****设置数据库连接名****/
m_database.setDatabaseName(name);
}
m_database.setUserName("root");
m_database.setPassword("root");
if(!m_database.open())
{
setLastError(m_database.lastError().text());
return false;
}
m_sqlQuery = QSqlQuery(m_database);
qDebug()<<QSqlDatabase::connectionNames();
return true;
}
void MySqlDataBase::closeDB()
{
if(m_database.isOpen())
m_database.close();
}
/*********创建数据库表格**************/
bool MySqlDataBase::createTable(QString table,QMap<QString,QString> map)
{
if(!isTableExist(table))
{
QString tableList = QString("create table if not exists %1 (").arg(table);
QMapIterator<QString,QString> iter(map);
while(iter.hasNext())
{
iter.next();
tableList.append(QString("%1 %2").arg(iter.key()).arg(iter.value()));
if(iter.hasNext())
tableList.append(",");
}
tableList.append(")");
//执行sql语句
return this->exec(tableList);
}
else
{
setLastError(QString("Exist table<%1>").arg(table));
return false;
}
}
/*********数据库插入操作**************/
bool MySqlDataBase::insertRowTable(QString table,QVariantMap map)
{
QMap<QString,QString> tableContentMap;
if(!isTableExist(table))
{
setLastError(QString("Not find %1 table").arg(table));
return false;
}
else
{
tableContentMap = getTableInfo(table);
if(tableContentMap.isEmpty())
return false;
}
QString insertTableContent = QString("insert into %1(").arg(table);
QString values = QString(" values(");
QMapIterator<QString,QString> iter(tableContentMap);
while(iter.hasNext())
{
iter.next();
insertTableContent.append(QString("%1").arg(iter.key()));
values.append("?");
if(iter.hasNext())
{
insertTableContent.append(", ");
values.append(",");
}
}
insertTableContent.append(")");
values.append(")");
insertTableContent.append(values);
// qDebug()<<insertTableContent;
if(!this->prepare(insertTableContent))
return false;
QMapIterator<QString,QString> iter_(tableContentMap);
while(iter_.hasNext())
{
iter_.next();
m_sqlQuery.addBindValue(map[iter_.key()]);
}
return this->exec();
}
/*********删除数据库中的某一行*********/
bool MySqlDataBase::deleteRowTable(QString table,QString columName,QString value)
{
QString delereContent = QString("delete from %1 where %2 = '%3'").arg(table).arg(columName).arg(value);
return this->exec(delereContent);
}
/*********更新/更改某一个字段的n行数据*********/
bool MySqlDataBase::updateRowTable(QString table,QString name,QVariantMap map)
{
QString content = QString("update %1 set ").arg(table);
QMapIterator<QString,QVariant> iter(map);
while(iter.hasNext())
{
iter.next();
if(iter.hasNext())
content += QString("%1 = '%2',").arg(iter.key()).arg(iter.value().toString());
else
content += QString("%1 = '%2' ").arg(iter.key()).arg(iter.value().toString());
}
content += QString("where %1 = '%2'").arg(name).arg(map[name].toString());
return this->exec(content);
}
/*********更新某个字段为特定值的其他字段的值********/
bool MySqlDataBase::updateRowTable(QString table,QString targetkey,QString targetValue,QString name,QVariantMap map)
{
QString content = QString("update %1 set ").arg(table);
QMapIterator<QString,QVariant> iter(map);
while(iter.hasNext())
{
iter.next();
if(iter.key() == "UUID")
continue;
if(iter.hasNext())
content += QString("%1 = '%2',").arg(iter.key()).arg(iter.value().toString());
else
content += QString("%1 = '%2' ").arg(iter.key()).arg(iter.value().toString());
}
content += QString("where %1 = '%2' and %3 = '%4'").arg(targetkey).arg(targetValue).arg(name).arg(map[name].toString());
return this->exec(content);
}
/*********升序排列*************/
bool MySqlDataBase::sortTable(QString table,QString target)
{
/***select * from table by target*/
QString sortContent = QString("select * from %1 order by '%2'").arg(table).arg(target);
return this->exec(sortContent);
}
/********获取数据库的查询结果*******/
QList<QVariantMap> MySqlDataBase::getValues(int page,int pageNum)
{
QList<QVariantMap>list;
bool ok = m_sqlQuery.isSelect();
if(!ok)
return QList<QVariantMap>();
if( (!m_sqlQuery.seek(page)))
{
setLastError("gevalues error![The number of pages is out of the limit]");
}
do
{
QVariantMap map;
for(int i = 0;i < m_sqlQuery.record().count();i++)
{
map.insert(m_sqlQuery.record().field(i).name(),
m_sqlQuery.record().field(i).value());
}
list.append(map);
}while(m_sqlQuery.next() && --pageNum);
return list;
}
/****获取个数*****/
int MySqlDataBase::size()
{
int size = -1;
while(m_sqlQuery.isSelect() && m_sqlQuery.next())
{
/***驱动支持返回记录***/
if(m_sqlQuery.driver()->hasFeature(QSqlDriver::QuerySize))
{
size = m_sqlQuery.size();
break;
}
else
{
m_sqlQuery.last();
size = m_sqlQuery.at() + 1 ;
}
}
//返回第一个结果
m_sqlQuery.first();
return size;
}
QString MySqlDataBase::lastError()
{
return m_lastError;
}
void MySqlDataBase::setLastError(const QString& error)
{
m_lastError = error;
}
QSqlQuery& MySqlDataBase::getSqlQUery()
{
return m_sqlQuery;
}
bool MySqlDataBase::isTableExist(QString table)
{
QStringList tables = m_database.tables();
if(tables.contains(table))
return true;
else
return false;
}
bool MySqlDataBase::prepare(const QString& query)
{
if(!m_sqlQuery.prepare(QString(query)))
{
setLastError(m_sqlQuery.lastError().text());
return false;
}
return true;
}
bool MySqlDataBase::exec(const QString &query)
{
if(!m_sqlQuery.exec(QString(query)))
{
setLastError(m_sqlQuery.lastError().text());
return false;
}
return true;
}
bool MySqlDataBase::exec()
{
if(!m_sqlQuery.exec())
{
setLastError(m_sqlQuery.lastError().text());
return false;
}
return true;
}
QMap<QString,QString> MySqlDataBase::getTableInfo(QString table)
{
QMap<QString,QString>tableMap;
QString str = QString("PRAGMA table_info(%1)").arg(table);
m_sqlQuery.prepare(str);
if(m_sqlQuery.exec())
{
while(m_sqlQuery.next())
{
tableMap[m_sqlQuery.value(1).toString()] = m_sqlQuery.value(2).toString();
}
return tableMap;
}
else
{
setLastError(m_sqlQuery.lastError().text());
return tableMap;
}
}
#if 0
bool MySqlDataBase::initDataBase()
{
db = QSqlDatabase::addDatabase("QMYSQL");//设置数据库类型
db.setHostName("localhost");//设置数据库主机名
db.setDatabaseName("mysql");//设置数据库的名字
db.setUserName("root");//设置数据库登录用户
db.setPassword("root");//设置数据库登录密码
if(!db.open())
{
qDebug()<<"database open failed";
QSqlError error = db.lastError();
qDebug()<<error.text();
return false;
}
qDebug()<<"database open success";
return true;
}
#endif