Qt: 数据库操作;

QT的数据库操作有两种方式: 一) 使用QsqlTableModel类, 可以配合QTableView进行界面显示并进行数据库操作,

这种方法比较方便快捷; 二)  使用原始SQL语言, 利用INSERT, UPDATE, SELECT, DELETE实现插入,更新,查询,删除功能;

1) QSqlTableModel类的使用;      

    
    QSqlDatabase db;                   //数据库要打开;
    QString  szTable = "test";   //数据表名;
    m_pSqlTableModel = new QSqlTableModel(this, db);       // bind tableView;
    m_pSqlTableModel->setEditStrategy(QSqlTableModel::OnManualSubmit);    //有三种编写模式;
    m_pSqlTableModel->setTable(szTable);     //指定数据表;
    m_pSqlTableModel->setFilter("id = 1");      //where条件;
    m_pSqlTableModel->select();                 //相当于SQL语言  select;

  1、添加记录;         

int nRowNum = m_sqlTableModel->rowCount();      //记录数;
QSqlRecord record = m_sqlTableModel->record();     //
m_sqlTableModel->setRecord(nRowNum, record);
if( !m_sqlTableModel->submitAll() )
{
      qDebug() <<"submit error";  
}

   2、修改记录; 

QSqlTableModel *pMode = dynamic_cast<QSqlTableModel *>(ui->tableView->model());
    pMode->database().transaction(); //开始事务操作
    if (pMode->submitAll()) // 提交所有被修改的数据到数据库中
    {
        pMode->database().commit(); //提交成功,事务将真正修改数据库数据
    } else {
        pMode->database().rollback(); //提交失败,事务回滚
        QMessageBox::warning(this, tr("tableModel"),tr("数据库错误: %1").arg(pMode->lastError().text()));
    }
    pMode->revertAll(); //撤销修改

  3、查询记录;

m_pSqlTableModel->setFilter("id= 1");
m_pSqlTableModel->select();                        //查询;

      4、删除记录;

    
//  实现多行删除;    删除的关键函数 removeRow   
QItemSelectionModel *pSelectModel = ui->tableView->selectionModel();
    QModelIndexList indexList = pSelectModel->selectedIndexes();    //被选择的;
    QMap<int,int>rowMap;
    foreach (QModelIndex index, indexList)
    {
        if(! index.isValid()) return;
        if(index.column()!=0) continue;
        rowMap.insert(index.row(),0);
    }
    QMapIterator<int,int> rowMapIterator(rowMap);              //如果要删除多行, 直接一行一行的删除会出现位置的移动,  这里通过将所有的要删除的行保存起来,按照从后往前的方法进行删除, 这样就解决了位置移动导致的删除错误;
    rowMapIterator.toBack();
    while(rowMapIterator.hasPrevious())
    {
        rowMapIterator.previous();
        int rowm=rowMapIterator.key();
        m_pSqlTableModel->removeRow(rowm);
    }
    m_pSqlTableModel->submitAll();
    m_pSqlTableModel->select();

 QItemSelectionModel是QTableView的选取封装类,通过该类可以方便的获取当前选取的区域;

2) 原始SQL语句的使用;

略;

 

注: 该博文为扩展型;

原文地址:https://www.cnblogs.com/yinwei-space/p/10419041.html