Qt 中QTableView控件调用sql简单整理

Qt 中QTableView控件调用sql简单整理

1.建立公共方法

private:    
  QSqlDatabase m_db;
1)打开数据库
void SqlToolWnd::onInitDBConn()
{   
    m_db = QSqlDatabase::addDatabase("QSQLITE");
    m_db.setDatabaseName("sfclient.db");   
    if(!m_db.open())   
    {       
       qDebug() << "Error: Failed to connect database." << m_db.lastError(); 
    }
}

2.关闭数据库

void SqlToolWnd::ExitConn()
{
  m_db.close();
}

3.创建数据表

void SqlToolWnd::on_createPushButton_clicked()
{
    onInitDBConn();
    QSqlQuery sql_query;
    if(!sql_query.exec("create table student(id int primary key, name text, sex text)"))
    {
        qDebug() << "Error: Fail to create table."<< sql_query.lastError();
    }
    else
    {
        qDebug() << "Table created!";
    }
    ExitConn();
}

4.增加数据记录

void SqlToolWnd::on_addPushButton_clicked()
{
    onInitDBConn();
    QSqlTableModel *model = new QSqlTableModel(this);
    model->setTable(QString::fromLocal8Bit("学生表"));
    model->select();

    int row = model->rowCount();
    model->insertRows(row,1);
    model->setData(model->index(row,0),"1900010105003");
    model->setData(model->index(row,1),QString::fromLocal8Bit("刘备"));
    model->setData(model->index(row,2),QString::fromLocal8Bit("男"));
    model->setData(model->index(row,3),"1886-02-20");
    model->setData(model->index(row,4),QString::fromLocal8Bit("军事应用系"));
    model->setData(model->index(row,5),QString::fromLocal8Bit("军事管理科学"));
    model->setData(model->index(row,6),"01");
    model->submitAll();

    ui->tableView->setModel(model);
    ExitConn();
}

5.删除数据

void SqlToolWnd::on_deletePushButton_clicked()
{
    onInitDBConn();
    QSqlTableModel *model = new QSqlTableModel(this);
    model->setTable(QString::fromLocal8Bit("学生表"));
    SqlParamDlg paramDlg;
    if(QDialog::Accepted == paramDlg.exec())
    {
        if(!paramDlg.m_param.isEmpty())
        {
            QString sParam = QString(QString::fromLocal8Bit("学生表.'学号'='%1'")).arg(paramDlg.m_param);
            qDebug()<<sParam;
            model->setFilter(sParam);
            model->select();
            if(model->rowCount()==1)
            {
                model->removeRows(0,1);
                model->submitAll();
            }
        }
        else
        {
            QString sParam = QString::fromLocal8Bit("学生表.'性别'='男'");
            qDebug()<<sParam;
            model->setFilter(sParam);
            model->select();
            if(model->rowCount()>0)
            {
                model->removeRows(0,model->rowCount());
                model->submitAll();
            }
        }
    }
    else
    {
        ExitConn();
        return;
    }

    ui->tableView->setModel(model);
    ExitConn();
}

6.修改数据表记录

void SqlToolWnd::on_modifyPushButton_clicked()
{
    onInitDBConn();
    QSqlTableModel *model = new QSqlTableModel(this);
    model->setTable(QString::fromLocal8Bit("学生表"));
    SqlParamDlg paramDlg;
    if(QDialog::Accepted == paramDlg.exec())
    {
        if(!paramDlg.m_param.isEmpty())
        {
            QString sParam = QString(QString::fromLocal8Bit("学生表.'学号'='%1'")).arg(paramDlg.m_param);
            qDebug()<<sParam;
            model->setFilter(sParam);
            model->select();
            if(model->rowCount()==1)
            {
                QSqlRecord record = model->record(0);
                record.setValue(QString::fromLocal8Bit("姓名"),QString::fromLocal8Bit("夏侯惇"));
                model->setRecord(0,record);
                model->submitAll();
            }
        }
    }
    else
    {
        ExitConn();
        return;
    }

    ui->tableView->setModel(model);
    ExitConn();
}

7.查询数据表记录

void SqlToolWnd::on_SelectPushButton_clicked()
{
   onInitDBConn();
   QSqlTableModel *model = new QSqlTableModel(this);
   model->setTable(QString::fromLocal8Bit("学生表"));
   SqlParamDlg paramDlg;
   if(QDialog::Accepted == paramDlg.exec())
   {
       if(!paramDlg.m_param.isEmpty())
       {
           QString sParam = QString(QString::fromLocal8Bit("学生表.'姓名'='%1'")).arg(paramDlg.m_param);
           qDebug()<<sParam;
           model->setFilter(sParam);
       }
       else
       {
           model->setFilter("");
       }
   }
   else
   {
       ExitConn();
       return;
   }
   model->select();
   ui->tableView->setModel(model);
   ExitConn();
}

说明:QTableView控件提供了方便访问sql接口,本文只是简单写了多种方案的一种,简便了sql的操作。

方案一:利用QSqlQuery构造函数操作数据库

QSqlQuery query;
query.exec("select Name, Salary FROM Employee where Salary > 1000");
while (query.next())
{
    QString Name = query.value(0).toString();
    int Salary = query.value(1).toInt();
    qDebug() << Name << Salary;
}

方案二:利用QSqlQuery与prepare,bindValue

QSqlQuery query;
query.prepare("INSERT INTO employee (id, name, salary) " "VALUES (:id, :name, :salary)");
query.bindValue(":id", 10001);
query.bindValue(":name", "Tom");
query.bindValue(":salary", 8500);
query.exec();

方案三:利用QSqlQuery与prepare,addBindValue

QSqlQuery query;
query.prepare("INSERT INTO employee (id, name, salary) " "VALUES (:id, :name, :salary)");
query.addBindValue(10001);
query.addBindValue("Tom");
query.addBindValue(8500);
query.exec();

方案四:QSqlQueryModel与setQuery,setHeaderData操作数据表

QSqlQueryModel *model = new QSqlQueryModel(ui->tableView);
model->setQuery("select * from student");
model->setHeaderData(0,Qt::Horizontal,QObject::tr("name"));
model->setHeaderData(1,Qt::Horizontal,QObject::tr("score"));
ui->tableView->setModel(model);
 

猜你喜欢

转载自blog.csdn.net/leiyang2014/article/details/116572271