数据库操作,增删改查,事务以及model


seek(int n)//query指向结果集的第n条记录。 
first() //query指向结果集的第一条记录。
last() //query指向结果集的最后一条记录。
next() //query指向下一条记录,每执行一次该函数,便指向相邻的下一条记录。 
previous() //query指向上一条记录,每执行一次该函数,便指向相邻的上一条记录。 
record() //获得现在指向的记录。 
value(int n) //获得属性的值。其中n表示你查询的第n个属性,该函数返回QVariant类型的数据
at() //获得现在query指向的记录在结果集中的编号。 
//需要说明,当刚执行完query.exec(“select * from student”);这行代码时,query是指向结果集以外的,我们可以利用query.next(),当第一次执行这句代码时,query便指向了结果集的第一条记录。当然我们也可以利用seek(0)函数或者first()函数使query指向结果集的第一条记录。但是为了节省内存开销,推荐的方法是,在query.exec(“select * from student”);这行代码前加上query.setForwardOnly(true);这条代码,此后只能使用next()和seek()函数。

事务是数据库的一个重要功能,所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。在Qt中
transaction()//开始一个事务操作,
commit()函数或rollback()函数进行结束。
commit()//表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据库的更新写回到数据库,事务正常结束。
rollback()
//表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有已完成的操作全部撤销,回滚到事务开始时的状态。
 
如下面的例子:
if(QSqlDatabase::database().driver()->hasFeature(QSqlDriver::Transactions)) //先判断该数据库是否支持事务操作 

    QSqlQuery query; 
    if(QSqlDatabase::database().transaction()) //启动事务操作 
    {  //下面执行各种数据库操作
        query.exec("insert into student values (14, 'hello')"); 
        query.exec("delete from student where id = 1"); 
        if(!QSqlDatabase::database().commit()) 
        { 
            qDebug() << QSqlDatabase::database().lastError(); //提交 
            if(!QSqlDatabase::database().rollback()) 
                qDebug() << QSqlDatabase::database().lastError(); //回滚 
        } 
    }
    //输出整张表 
    query.exec("select * from student"); 
    while(query.next()) 
        qDebug() << query.value(0).toInt() << query.value(1).toString(); 


//简单的数据库操作和数据显示模型:
//只读的QSqlQueryModel,
//操作单表的QSqlTableModel
//可以支持外键的QSqlRelationalTableModel。

QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery("select * from student"); 
model->setHeaderData(0, Qt::Horizontal, tr("id")); 
model->setHeaderData(1, Qt::Horizontal, tr("name")); 
QTableView *view = new QTableView;
view->setModel(model); 
view->show();
 
 
model = new QSqlTableModel(this); 
model->setTable("student"); 
model->setEditStrategy(QSqlTableModel::OnManualSubmit); 
//OnManualSubmit表明我们要提交修改才能使其生效。QSqlTableModel::OnFieldChange //属性变化时写入数据库
model->select(); //选取整个表的所有行
ui->tableView->setModel(model); //
ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); //使其不可编辑

model->database().transaction(); //开始事务操作 
if (model->submitAll()) 

    model->database().commit(); //提交 
}

model->submitAll()//提交所有更改
model->revertAll();//撤销修改,但必须在提交修改之前,即在保存到数据库之前
model->setEditStrategy(QSqlTableModel::OnManualSubmit); //OnManualSubmit表明我们要提交修改才能使其生效。

//查找
QString name = ui->lineEdit->text(); 
model->setFilter(QObject::tr("name = '%1'").arg(name)); //根据姓名进行筛选 
model->select(); //显示结果

//排序
model->setSort(0,Qt::AscendingOrder); //id属性,即第0列,升序排列 Qt::DescendingOrder降序
model->select();

//删除
int curRow = ui->tableView->currentIndex().row(); //获取选中的行 
model->removeRow(curRow); //删除该行 
int ok = QMessageBox::warning(this,tr("删除当前行!"),tr("你确定""删除当前行吗?"), QMessageBox::Yes,QMessageBox::No); 
if(ok == QMessageBox::No) 

    model->revertAll(); //如果不删除,则撤销 

else
    model->submitAll(); //否则提交,在数据库中删除该行
    
//插入
int rowNum = model->rowCount(); //获得表的行数 
int id = 10; 
model->insertRow(rowNum); //添加一行 
model->setData(model->index(rowNum,0),id); //
model->submitAll(); //可以直接提交
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值