简单通用数据访问层

来源:互联网 发布:java在数据库中写的表 编辑:程序博客网 时间:2024/04/28 17:15
#ifndef DATAACCESS_H
#define DATAACCESS_H
#include <QStandardItemModel>
#include <QSqlDatabase>
class QDac
{
public:
    QDac();
    ~QDac();
    void InitDatabase();
    void UninitDataBase();
    void exec(const QString &request,QAbstractItemModel &model,bool isCmd = true);
    void submit(const QString &request,const QAbstractItemModel &model,int effictRow,bool isCmd = true);
    //int genId(const QString &tableName);
protected:
    void Load(const QString &sql, QAbstractItemModel &model);
};
int genId(const QString &tableName);
#endif // DATAACCESS_H
#include "dataaccess.h"
#include <QSqlQuery>
#include <QSqlRecord>
#include <QSqlError>
#include <QDebug>
#include <QApplication>
#include <QSqlTableModel>
#include "qdam.h"
QDac::QDac()
{
}
QDac::~QDac()
{
}
void QDac::InitDatabase()
{
    QString path = QApplication::applicationDirPath();
    path += "/posionData.s3db";
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(path);
    if(!db.open())
    {
        qDebug() << "open db error!";
    }
}
void QDac::UninitDataBase()
{
}
void QDac::Load(const QString &sql, QAbstractItemModel &model)
{
    model.removeRows(0,model.rowCount());
    model.removeColumns(0,model.columnCount());
    //model.r
    QSqlQuery query(sql);
    if(query.exec())
    {
        int n = query.record().count();
        model.insertColumns(0,n);
        int row = 0;
        while(query.next())
        {
            model.insertRow(row);
            for(int col=0; col<n; col++)
            {
                model.setData(model.index(row,col),query.value(col));
            }
            row++;
        }
    }
    else qDebug() << query.lastError().text();
}
void QDac::exec(const QString & request, QAbstractItemModel &model, bool isCmd)
{
    QDam * dam = QDam::getInstance();
    if(dam)
    {
        if(isCmd)
        {
            QString str = dam->mapCmd(request);
            Load(str,model);
        }
        else
        {
            QString str = dam->mapAction(request);
            Load(str,model);
        }
    }
}
void QDac::submit(const QString &request,const QAbstractItemModel &model,int effictRow,bool isCmd)
{
    QDam * dam = QDam::getInstance();
    if(dam)
    {
        QString sql;
        if(isCmd)sql = dam->mapCmd(request);
        else sql = dam->mapAction(request);
        int n = model.columnCount();
        QSqlQuery query;
        query.prepare(sql);
        for(int i=0; i<n; i++)
        {
            QModelIndex idx = model.index(effictRow,i);
            query.bindValue(i,idx.data());
        }
        if(!query.exec())qDebug() << "submit error : " << query.lastError().text();
    }
}
int genId(const QString &tableName)
{
    /*
    QString sql = QString("select maxId from TableIndex where namne = %0").arg(tableName);
    QSqlQuery query(sql);
    if(query.exec())
    {
        if(query.size() > 0)
        {
            query.next();
            int id = query.value(0).toInt();
            id++;
            sql = QString("update TableIndex set maxId = %0 where name = %1").arg(id).arg(tableName);
            QSqlQuery update(sql);
            update.exec();
            return id;
        }
    }
    else qDebug() << query.lastError().text();
    //else
    {
        sql = QString("insert into TableIndex values(%0,%1)").arg(tableName).arg(100);
        QSqlQuery insert(sql);
        if(insert.exec())return 100;
        qDebug() << insert.lastError().text();
    }
    */
    QSqlTableModel model;
    model.setTable("RecordIndex");
    model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    model.select();
    for(int i=0; i<model.rowCount(); i++)
    {
        QModelIndex idx = model.index(i,0);
        if(idx.data().toString() == tableName)
        {
            idx = model.index(i,1);
            int id = idx.data().toInt();
            id++;
            model.setData(idx,id);
            model.submitAll();
            return id;
        }
    }
    int n = model.rowCount();
    model.insertRow(n);
    model.setData(model.index(n,0),tableName);
    model.setData(model.index(n,1),100);
    model.submitAll();
    return 100;
}

0 0
原创粉丝点击