数据库连接与基本操作

Qtsql模块提供了与平台以及数据库种类无关的访问SQL数据库的接口,这个接口利用Qt的模型/视图结构将数据库与用户界面集成的一套类来支持。

习惯SQL语法可以使用QSqlQuery类,它提供了一种直接执行任意的SQL语句并处理其结果的方式。对于喜欢更高级,更友好的数据库界面以避免SQL语法的用户,QSqlTableModel和QSqlRelationalTableModel提供了合适的抽象。

一般建立数据库连接的方式

QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL"); //第二个参数是连接名,设置了就可以用database("连接名")来返回指定连接
db.setHostName("your name");
db.setDatabaseName("mydb");
db.setUserName("root");
db.setPassword("520");
if(!db.open()){
    QMessageBox::criti.cal(0,QObject::tr("Database Error"),db.lastError().text());
    return false;
   }
return true;

一旦连接建立,就可以使用QSqlQuery执行底层数据库支持的任何SQL语句了。如果想要移除建立的连接,需要使用QSqlDatabase::close()关闭,再调用QSqlDatabase::removeDatabase()来移除

QSqlQuery query;
query.exec("SELECT title,year FROM cd WHERE year>=1998");
//第一次调用next()会定位到结果集中的第一条记录,之后会往前移一条记录
while(query.next()){
 QString title=query.value(0).toString();
 int year=query.value(1).toInt();
 }

value()函数把字段值作为QVariant返回,可存储于数据库中的不同数据类型都可以映射为相应的C++和Qt类型并且存储到QVariant中,在操作一个大数据集时,为了便于优化,在调用exec()之前调用QSqlQuery::setForwardOnly(true),然后只使用next()遍历结果集。可以通过对查询调用isActive()来检查是否有错误发生

if(!query.isActive())
 QMessageBox::warning(this,tr("Database Error"),query.lastError().text());

可以使用numRowsAffected()返回受SQL语句影响的行数。也可以使用prepare()来指定一个包含占位符的查询,如果想批量加入那么可以定义一个QVariantList参数,然后调用addBindValue().

QSqlQuery query;
query.prepare("insert into cd(id,artistid,title,year)"
     "values(:id,:artistid,:title,:year)");
query.bindValue(":id",203);
query.bindValue(":artistid",102);
query.bindValue(":title","Living in America");
query.bindValue(":year",2002);
query.exec();

如果要使用事务处理,那么事务的开始与结束如下:

QSqlDatabase::database().transaction();
QSqlQuery query;
query.exec("select id from artist where name="Gluecifer");
if(query.next()){
 int artistId=query.value(0).toInt();
 query.exec("insert into cd(id,artistid,title,year)"
    "values(201,"+QString::number(artistId)+",'Riding the Tiger',1997)");
}
QSqlDatabase::database().commit();

Qt提供高级接口QSqlTableModel,可以用来独立处理数据库而不涉及任何的图形用户界面,在使用它之前,一般先定义它的编辑策略,由枚举QSqlTableModel::EditStrategy定义。它的使用如:

QSqlTableModel model;
model.setTable("cd");
model.setFilter("year>=1998"); //查询条件
model.select();//查询
 //利用record获得某一给定的记录,或者利用value()获取单独的字段
for(int i=0;i<model.rowCount();++i){
 QSqlRecord record=model.record(i);
 QString title=record.value("title").toString();
int year=record.value("year").toInt();
 }

对于value()既可以接受字段名也可以接受字段索引,在对大数据集进行操作时,建议利用索引来指定字段

int titleIndex=model.record().indexOf("title");
int yearIndex=model.record().indexOf("year");
for(int i=0;i<model.rowCount();i++){
 QSqlRecord record=model.record(i);
 QString title=record.value(titleIndex).toString();
 int year=record.value(yearIndex).toInt();
}

在数据库中插入记录,使用insertRows,使用setData对其进行设置

int row=0;
model.insertRows(row,1);
model.setData(model.index(row,0),123);
model.setData(model.index(row,1),"Shanghai my Heart");
model.setData(model.index(row,2),224);
model.setData(model.index(row,3),2003);
model.subnnitAll();  //进行修改后进行提交,如果失败返回false

如果要更新某一记录,要将更改的数据回写到数据库中

QSqlRecord record=model.record(0);
record.setValue("title","Melody A.M");
record.setValue("year",record.value("year").toInt()+1);
model.setRecord(0,record);
model.submitAll();

猜你喜欢

转载自blog.csdn.net/weixin_38893389/article/details/80981345
今日推荐