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都放到析构函数中,则正常显示:
明天考虑下怎么用QSqlTableWidget,看是不是比这几个都方便。
实现的源码下载:
https://download.csdn.net/download/zjjsd195/85299757https://download.csdn.net/download/zjjsd195/85299757