QT数数据库Mysql中 QSqlQuery、QSqlQueryModel 、和QSqlTableModel实现增删改查代码

QT数数据库Mysql中 QSqlQuery、QSqlQueryModel 、和QSqlTableModel实现增删改查代码,第1张

用qsqltablemodel的insetrow()、setdata()、submitall()函数实现增;

 officeTable->insertRow(0);

 officeTable->setData(officeTable->index(0, 0), row);

 officeTable->setData(officeTable->index(0, 1), newWnd->imageFileEditor->currentIndex());

 officeTable->setData(officeTable->index(0, 2), newWnd->locationText->text());

 officeTable->setData(officeTable->index(0, 3), newWnd->countryText->currentText());

 officeTable->setData(officeTable->index(0, 4), newWnd->descriptionEditor->toPlainText());

 officeTable->submitAll();

用removerow()、submitall()函数实现删;

 int officeCount = officeTable->rowCount();

 officeTable->removeRow(id);

 for(int i = id; i < officeCount - 1;i++)

 {

  officeTable->setData(officeTable->index(i, 0), i);

 }

 officeTable->submitAll();

用QSqlRecord类的setvalue实现改;

  QSqlRecord recordCurrentRow = officeTable->record(id);

  recordCurrentRowsetValue("id", id - 1);

  officeTable->setRecord(id - 1, recordCurrentRow);

  officeTable->submitAll();

用QSqlRecord类的value进行比较实现查;

int Dialog::findArtistId(const QString &artist)

{

    QSqlTableModel artistModel = model->relationModel(2);

    int row = 0;

    while (row < artistModel->rowCount()) {

        QSqlRecord record = artistModel->record(row);

        if (recordvalue("artist") == artist)

            return recordvalue("id")toInt();

        else

            row++;

    }

    return addNewArtist(artist);

}

你这种全字段匹配查询不能这么写的,这种查询叫全文检索,sqlite有现成的全文检索方案,需要在sqlite上做些配置

官方文档上有写的

>

1、线程内注册与连接数据库的竞争问题

文档上对多线程下数据库应用的注意事项写的很简明,一个线程创建的 QSqlDatabase 对象和 查出来的 QSqlQuery 对象只能给本线程用(注意,是对象,不是数据库连接本身,连接本身用名字可以多线程使用),其他情况是“不支持的”。在一个需要有几个线程并发访问不同数据库的应用中,我首先试图在各个线程的起始分别以不同的名称调用 addDatabase / database 、open,但是程序偶然会崩溃,跟踪后发现,虽然Qt 声称很多方法是“线程安全”的,但是几个方法串起来,就出问题了。Qt 会动态的加载数据库的plugin, 加载 plug in 的部分,涉及到对本地库文件的管理,这一部分,出现了竞争。于是,很自然的想到在初始连接部分设置 Mutex 保护,从 addDatabase / database到 open 的部分,要保证其原子性,问题再也没有出现。

2、数据库连接意外断裂后,恢复连接的问题

在MFC 中,一旦中途TCP连接断裂,直接重新 Open 就可以了。在Qt 里,这一招不好使了。即便 调用了 close ,再次open 也是不行的。处理方法:

在检测到问题出现后,关闭连接,并 removeDatabase; 而后,不要立刻 addDatabase, 反而是要回到该连接所在的事件循环。没有详细跟源码,很可能在 removeDatabase 后的事件循环中,Qt 内部做了一些释放 *** 作。 怎么办呢, 可以设置一个恢复定时器,比如 1分钟,重新 addDatabase,就可以啦。如果心急的话,直接显式调用processEvent() 方法强制循环。

在多线程下,注意1中的问题,需要 Mutex保护。

3、数据库插件的依赖性问题

在 Windows 下,有时我们的机器上按了好几个 Qt 版本,PATH里索性神马也不设置,依赖开发环境的继承环境适应不同的版本。这有两个问题。一是发布程序的时候,数据库驱动依赖的dll 也要与可执行文件在同一路径下发布。比如 mysql 的 dll, PostgreSQL 的依赖等。二是在集成开发环境中,这些依赖也要位于执行档文件夹下。否则,会造成虽然可以枚举到可用驱动,但是死活连接不上。调试一下就知道,原来是在路径中找不到依赖项,导致dll加载失败哦!

px solid green;

border-radius: 4px;

padding: 2px;

background-image: url(images/xxxpng);

}

请确认一下你的 style sheet 代码是不是与上面类似的(主要看最后一行);

如果你改变了或者qrc文件中的内容,最好将整个工程重新都重新编译一次。再看能不能显示。如果还不能显示,就直接用QLabel的

void setPixmap ( const QPixmap & )

方法来设置算了。

以上就是关于QT数数据库Mysql中 QSqlQuery、QSqlQueryModel 、和QSqlTableModel实现增删改查代码全部的内容,包括:QT数数据库Mysql中 QSqlQuery、QSqlQueryModel 、和QSqlTableModel实现增删改查代码、QT sqlite 模糊查询 表中全部字段数据、QT多线程查询数据库显示到tablewidget里面等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/10179766.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存