问题标签 [qtsql]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 在多线程程序中正确使用 QSqlDatabase
基于 Qt 文档:
只能在创建它的线程内使用连接。不支持在线程之间移动连接或从不同线程创建查询。
困扰我的问题是,当我复制构建数据库实例时会发生什么。例如,这是主线程中的代码:
这是工作线程中的连接:
这个线程安全吗?通常,这样的操作在 C++ 中是安全的,但由于 QT 使用隐式共享和线程关联,我不再确定。
他们说:一个连接只能在创建它的线程中使用,但这是什么意思?是创建连接的QSqlDatabase::addDatabase 点还是调用open()函数时的实际位置。
更新:
在 Laszlo Papp 的回答之后,并最终查看了 Qt 源代码,我必须说 Qt 这部分的设计在我看来是有缺陷的。
如果我理解正确,QSqlDatabase 在后台使用隐式共享,但不幸的是它不是真正的隐式共享,因为 QSqlDatabase 实例的复制构造函数不会在需要时创建共享数据的新实例。更糟糕的是,您不能创建临时连接,而是必须使用静态方法 addDatabase/removeDatabase,在这种情况下,您必须同步线程以避免名称冲突。
这当然使得在 QtConcurrent 中使用 QSqlDatabase 变得非常困难,特别是如果连接应该深埋在某些抽象后面。由于我们不知道代码将在哪个线程上运行,因此我们无法在两个调用之间保持连接打开。如果我们想生成动态数量的任务,我们需要确保任务不使用相同的数据库名称。
所有这些让我想知道设计目标以及隐式共享是否适合这种特殊情况。恕我直言,更好的解决方案是让复制构造函数真正完成它并为您制作连接副本。那些不想拥有私有/临时副本的人仍然可以使用 addDatebase/removeDatabase,在这种情况下,需要修改方法 database() 以返回引用。
c++ - QSqlQuery::value: 未定位在有效记录上
像这样设置表模型后:
内容显示正确,但在我编辑数据项然后按回车后,出现此错误:
当我关闭应用程序并重新启动它时,我发现我上次所做的编辑没有存储到数据库中,任何人都可以在这里解决我的问题。
注意:我没有使用
这里。
c++ - Singletone 中的数据库连接
我有一个多用户支持server
,它基于qxmpp
编写Qt
并通过继承扩展的库QXmppServerExtension
。所以,我的问题是:Considering multi-user support in my server, whether it's safe or not to use a Singletone class for database connection and holding a connection for QSqlQuery?
因为,所有通过数据库工作的扩展都分别使用它。
c++ - SQLite+Qt:从表中选择总是返回单行
我使用以下代码使用 Qt 从 SQLite DB 获取数据:
该Words
表确实包含ref_id
字段等于所需值的行。我已经使用作为 Qt 演示应用程序提供的 sqlbrowser 进行了检查。但QSqlQuery::next( )
仅第一次返回 true,我无法获取其余行。
顺便说一句,在这里我发现了类似的问题,但对我来说向后迭代不起作用
下面我把整个功能代码:
解决方案:我没有找到问题的原因,但以下变体似乎是有效的变体:
qt - 解析 QSqlRelationalTable 中的复杂外键
我正在使用 QSqlRelationalModel,但我遇到了一些问题。
例如,如果我们处理简单的表格,例如:
然后我可以写:
它会正常工作,并显示位置名称而不是 ID。
但就我而言,我不能应用这种方法。假设我有下一张桌子:
假设我想使用 Participant 作为 QSqlRelationalTable:
而且我想在视图中显示 Person.firstname 而不是 experience_id (而且我不想失去编辑功能)。我怎样才能做到这一点?
我不能像上面的例子那样使用 setRelation() ,因为:
我不能写“person_id”,因为我想显示名字而不是 person_id。
c++ - QDataWidgetMapper 和 QDateEdit 值
我有带有一些表的 QSqlTableModel,假设它是一个
而且我还有 QDataWidgetMapper 它将一些小部件(lineedits 等)映射到模型中的适当列。
所以问题出在QDateEdit
元素上。
当我更改birthEdit
( QDateEdit
) 中的日期时,相应表中的值实际上并未更改,因为它们以不同的格式存储,并且我也收到错误消息:
数据库中的日期存储在“yyyy-MM-dd”中,而QDateEdit
返回另一个日期(我想)。据我所知QDataWidgetMapper
,在映射小部件中使用 USER 属性来获取/设置值。
我该如何解决我的问题?
qt - 更改后的 QSqlRelationalModel 模型/视图更新
我在更改后更新模型/视图时遇到问题。
为了更好地解释我的意思,我用 SQLite 写了一个简单的例子。
所以 main.cpp 文件:
MainForm.h 文件:
那么关于错误......在编辑包含外键的单元格后,显示的值变得错误。因此,例如在部门更改后,它显示为整数而不是字符串。为什么?是Qt错误吗?
添加新行后同样的问题。
c++ - Qt5.2可以找到mysql驱动但是加载不出来
操作系统:win7 编译器:mingw4.8(Qt5.2 附带)链接到:Fedora 核心版本 5,内核 2.6.15-1.2054_FC5 smp on an i686
消息
QSqlDatabase:未加载 QMYSQL 驱动程序 QSqlDatabase:可用驱动程序:QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL 7 “未找到共享库。” 驱动程序:(“QSQLITE”、“QMYSQL”、“QMYSQL3”、“QODBC”、“QODBC3”、“QPSQL”、“QPSQL7”)
“未加载驱动程序未加载驱动程序”</p>
c++ - 模型刷新后 QTableView 保留选择
我尝试构建一个用户界面,该界面显示表格的内容,同时每秒刷新数据。
因此我有一系列模型:
QSqlTableModel
- 访问表格内容- MyModel - 继承自来稍微
QIdentityProxyModel
修改数据(来源是 TableModel) - SomeFilterModels - 以 MyModel 作为源
该链以QTableView
. 因为QSqlTableModel
每秒刷新一次,所以 TableView 中的任何选择也会每秒被删除。现在我有两个想法来解决这个问题。
- 防止 TableModel 检测更改。这不是很好。
- 捕获模型即将更改之前和之后触发的一些事件以存储和恢复当前选择。遗憾的是,
QIdentityProxyModel
不会转发诸如 modelAboutToBeReset 或 modelReset 或 dataChanged 之类的信号。从 MyModel 重新发送这些信号也是不可能的,因为它们是私有的。
我一直在寻找其他方法来解决这些刷新问题,但没有成功。但我无法想象我是第一个使用代理模型链以及定期模型刷新和选择的人。
谁能给我一些提示?
提前致谢。
也许值得注意:
- 一个
QSqlTableModel
用于许多 TableViews。(使用不同的 FilterProxyModel 链。)所以我不能因为一个 View 有一个选择而停止刷新。 - 您可能认为我知道何时调用模型刷新方法。但是现在通过我的 ui 架构传递这个有点复杂。我的意思是模型已更新,并且 TableView 已经通过一些 ProxyModel 连接到更新的模型。应该不需要另一种沟通方式。
希望我的问题有意义。