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()<<query.value(0).toInt()<<query.value(1).toString();
    }
    db.close();

为了解决这个报错,可以用指针来做:

    // 指针对象
    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()<<query.value(0).toInt()<<query.value(1).toString();
    }
    db->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()<<query->value(0).toInt()<<query->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/85299757icon-default.png?t=M3K6https://download.csdn.net/download/zjjsd195/85299757

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐