Qt|QtSql数据库的三种创建方式

QtSQL数据库对象的创建,可以以变量和指针两种方式创建。
【Qt|QtSql数据库的三种创建方式】目前从案例看,用变量的例子比较多,但实际应用的时候,考虑到子类化等问题,还是指针类用的比较多,这里有一点写法上的小技巧,否则指针定义后可能无法打开数据库。
先看一下变量定义的方式:
用QMainWindow来创建工程,之后上代码:
这种定义方式,是QSqlDatabase和QSqlQuery都用变量表示,这是大家都使用的方式。这里要注意一点,close之后,如果使用remobedatabase,就会有一条警告提示,说什么db还在使用中。
这时候应该先删除db对象,在remove database。这里直接就没有使用remobe database,所以没报错。

// 1 对象定义方式 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("test.db"); if(!db.open()) { QMessageBox::critical(0,"错误","无法与指定数据库建立连接",QMessageBox::Cancel); return; } QSqlQuery query(db); query.exec("create table table1 (id int primary key, name varchar(20))"); query.exec("insert into table1 values(0, '张若昀')"); query.exec("insert into table1 values(1, '李铁')"); query.exec("insert into table1 values(2, '刘畊宏')"); query.exec("select * from table1"); while(query.next()) { qDebug()<

为了解决这个报错,可以用指针来做:
// 指针对象 QSqlDatabase *db = new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE","conn")); db->setDatabaseName("test.db"); if(!db->open()) { QMessageBox::critical(0,"错误","无法与指定数据库建立连接",QMessageBox::Cancel); return; } QSqlQuery query(*db); query.exec("create table table1 (id int primary key, name varchar(20))"); query.exec("insert into table1 values(0, '张若昀')"); query.exec("insert into table1 values(1, '李铁111')"); query.exec("insert into table1 values(2, '刘畊宏122')"); query.exec("select * from table1"); while(query.next()) { qDebug()<close(); delete db; QSqlDatabase::removeDatabase("conn");

这里因为是指针,所以可以用delete先把db删除,然后再remobe database,我不清楚变量是否也可以这样做。因此我倾向于使用指针来代替变量。
还有个小插曲,就是定义指针时,一定要在构造函数里写addDatabase,否则就无法正常运行。
此外,还考虑QSqlQuery是否也能搞成指针。下面看代码:
// 查询也用指针 db = new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE","conn")); db->setDatabaseName("test.db"); if(!db->open()) { QMessageBox::critical(0,"错误","无法与指定数据库建立连接",QMessageBox::Cancel); return; } query = new QSqlQuery(*db); query->exec("create table table1 (id int primary key, name varchar(20))"); query->exec("insert into table1 values(0, '张若昀111')"); query->exec("insert into table1 values(1, '李铁111')"); query->exec("insert into table1 values(2, '刘畊宏122')"); query->exec("select * from table1"); while(query->next()) { qDebug()<value(0).toInt()<value(1).toString(); }db->close(); delete db; QSqlDatabase::removeDatabase("conn");

这把query也改成指针,运行也是正常。
注意:对于SQL语句而言,如果你已经有了这个row,那么就不会更新。除非把db文件删除。
下面使用QSqlQueryModel和QTableView来实现数据库表的显示:只需要增加:
model = new QSqlQueryModel(this); model->setQuery("select * from table1",*db); view = new QTableView(this); view->setModel(model); setCentralWidget(view);

我的理解是,在做这个操作时,数据库是没有close的,也诶有remove,否则就会显示:
0 "张若昀" 1 "李铁111" 2 "刘畊宏122" 4 "张若昀111" 5 "马某某" QSqlQuery::exec: database not open

这是close之后,没有remve之前的显示,如果把close和remove都放到析构函数中,则正常显示:
Qt|QtSql数据库的三种创建方式
文章图片


明天考虑下怎么用QSqlTableWidget,看是不是比这几个都方便。

实现的源码下载:
https://download.csdn.net/download/zjjsd195/85299757Qt|QtSql数据库的三种创建方式
文章图片
https://download.csdn.net/download/zjjsd195/85299757

    推荐阅读