问题标签 [qsqldatabase]
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没有打印错误也没有输出?
我用来QSqlDatabase
向mysql插入数据。
首先,我定义了一个名为的类Inserter
:
然后,我Insert
在另一个定义为调度程序的类中使用:
当我运行这个程序时,Qt 打印警告:
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' 仍在使用中,所有查询都将停止工作。
QSqlDatabasePrivate::addDatabase: 重复连接名称 'qt_sql_default_connection',旧连接已删除。
QSqlDatabase::addDatabase() 应该每个类型和连接名称调用一次。多次调用 addDatabase("QMYSQL") 会导致
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
此外,在删除数据库时拥有现有的 QSqlQuery 对象会导致
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
如果上述警告的原因是正确的,为什么警告的顺序不是:
QSqlDatabasePrivate::addDatabase: 重复连接名称 'qt_sql_default_connection',旧连接已删除。
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' 仍在使用中,所有查询都将停止工作。
最后,我将初始代码移动到类Scheduler
中,如下所示:
没有打印警告或错误。
c++ - Qt——使用 SQLite 的程序崩溃
我有一个通过 Qt 库(我的意思是 QSqlDatabase)使用 SQLite 的应用程序。当我从 Qt Creator 运行此应用程序(在调试和发布配置中)时,一切都按预期工作,但是当我尝试通过 .exe 文件手动启动应用程序时,它在 SQLite 数据库操作后立即崩溃。我已经在可执行文件旁边有“sqldrivers”目录和“qsqlite.dll”文件。也不例外,因为我已经在使用 SQLite 的函数周围有一个 try-catch 块。
我究竟做错了什么?我该如何解决?
我正在使用 Qt5 和 MSVC-11.0
提前致谢。
c++ - 使用 Qt 以编程方式获取 primaryKey
我尝试以编程方式获取 primaryKey 并将其转换为 col 名称。这个功能不能像桅杆那样工作。
但我找不到让它工作的方法,它给了我空白字符串
qt - QSqlRelationalTableModel - 插入大于 256 的记录
我在 SQLite 数据库中有一个表节点={id,name} 和一个表段={id,nodeFrom,nodeTo},其中 node.id 和 segment.id 是 AUTOINCREMENT 字段。
我正在为 Node 创建一个 QSqlTableModel,如下所示:
我使用以下代码插入节点:
这似乎有效。现在,对于段,我定义了一个 QSqlRelationalTableModel,如下所示:
然后我有以下用于插入段的代码:
我可以使用 addNode() 成功添加 280 个节点。如果 nodeFrom<=256 和 nodeTo<=256,我也可以成功添加段。对于引用大于或等于 256 的节点的任何段,我得到一个
在 addSegment 函数的标有 (*) 的行之一中。
我搜索了一下,发现人们在达到神奇的 256 条记录时遇到了其他(显然不相关的)问题。似乎没有解决方案可以解决这个特定问题。
我究竟做错了什么?
谢谢!
qt - Qt 线程代码在 MAC、Linux 和 Windows 中的不同行为
我为接受来自不同客户端的连接的服务器编写了代码。每个客户端都在不同的线程中服务。每个线程访问数据库以获取数据,然后将此数据更新到连接到服务器的所有客户端。
1)当用户界面第一次向服务器请求数据时,它会正确响应,但在那之后服务器没有读取套接字,即服务器的 readyread() 没有被调用。有趣的是,这在mac 和 linux中运行良好,此问题仅在windows上可见
2)我能够验证当 DB 模块发出一个被线程捕获的信号时,会发生挂起,因为当我移除发射时一切正常。
在这里,我附上了所有需要的 .h 和 .cpp 代码
定义文件
主文件
数据库文件
我的数据库
我的线程.h
我的线程.cpp
我的服务器.h
我的服务器.cpp
这里我上面提到的信号是来自“mydb.cpp”的dataAvailable。如果我注释掉该行,则服务器会响应客户端消息。但是,如果在初始响应之后发出该信号,则服务器似乎挂起并且不再对来自客户端的传入消息做出反应。相同的代码在 mac 和 linux 中运行良好。但它仅在 Windows 中存在此问题。有人可以让我知道我做错了什么,它只在 Windows 中失败了吗?提前感谢您帮助我。
编辑:
这段代码的目的是,每当一个线程导致对数据库的更新调用时,每个线程(包括调用更新的线程)都会收到有关更改的通知。因此,预计当时运行的其他线程也会收到信号。
这是对服务器的期望:
能够同时允许来自多个客户端的 TCP 连接。
如果任何客户端请求信息,它会通过 TCP 连接获取所需的数据。
如果任何客户端更新信息,包括更新客户端在内的所有客户端都会通过 TCP 连接获得通知。
c++ - 如何通过 Qt 锁定数据库中的表?
我已经使用 c++ 连接到 Qt 中的数据库。
同时我有一个 Python 程序,它连接到同一个数据库并不断更新一个名为“myTable”的表。
从 Qt 我想在每次轮询时读取新更新的行。所以我想
锁表;读取所有行;删除所有行;解锁表。
如何在 Qt 中锁定和解锁表
c++ - 数据库连接封闭桂
我的问题是我的程序 Gui 已关闭。例如,我将此代码放在一个pushButtonClicked
方法中:
它会查看我的 Gui,但是当我单击按钮时,它会关闭窗口。
当我将此代码放在初始化方法中时,它不会查看窗口。
这段代码有什么问题?
该数据库是一个 QSqlDatabase。我在标题中声明它。
当我删除此代码时,一切正常。
qt - QSQLDatabase(使用SQLite)打开数据库需要很长时间
我开发了一个使用 SQLIte 数据库的应用程序 win QT。数据库的副本位于每个站点上。
在一个站点上,假设站点“BOB1”可以完美运行,没有任何问题。但是当我们尝试在另一个站点上使用它时,比如说“BOB2”,打开数据库连接需要很长时间(大约 2000 毫秒)。
我认为可能是网络问题,所以他们尝试使用站点“BOB1”的服务器作为他们的服务器,效果很好。但是当我尝试从站点“BOB1”使用站点“BOB2”的服务器时,我遇到了同样的问题。所以我认为这可能不是网络问题。
我想到的另一件事是,也许存在 DNS 解析问题。但是当我尝试使用 IP 和主机名 ping 服务器时,响应时间是相同的。
任何可能是问题的想法或指针。
PS:使用环境变量在 setDatabasePath() 函数中指定服务器 + 数据库文件路径。
c++ - Qt5/c++ 在调试期间生成“损坏的共享库列表”错误
我有一个看起来运行良好的 Qt5/C++ 应用程序,但是在调试模式 (GDB) 下运行时,QT Creator 控制台 (stderr) 上会弹出此错误 - 偶尔!:
我找不到任何有关原因的参考,也无法弄清楚是什么触发了它(与使用 QLinkedList 有关的其他事情。)我尝试切换到 QVector 但有时会弹出相同的错误。
这是什么,我该如何解决?Valgrind 说没有内存损坏......所以这是一个虚假报告问题吗?还是我做错了什么。
我已将上述错误追溯到下面的最后一行(第 4 行)。
这对我来说毫无意义......有人可以解释为什么 QSqlDatabase::addDatabase 行会导致损坏吗?同样,为什么只有在调试时才会出现错误......但在没有 gdb 的情况下运行时不会出现?
qt - 何时或如何将 QSqlTableModel 上的 fetchMore() 与 SQLite 数据库一起使用以使 rowCount() 工作?
我的类 DataTable 是从 QAbstractTableModel 派生的。它在内部使用 QSqlTableModel 对象从 db 表中获取数据。它代表数据库中每一行的记录(它做得更多,但记录计数始终是数据库表中的行数)。
使用 MySql,我的 DataTable::rowCount() 实现只需调用 QSqlTableModel 上的 rowCount(),效果很好。
现在使用 SQLite,如果 db 表中有超过 256 行,Qt 的 SQLite 驱动程序会返回 256 的行数,所以我的 DataTable 类也返回 256 - 这是错误的。文档告诉我打电话给while (sql_model->canFetchMore()) sql_model->fetchMore();
. 在创建内部 QSqlTableModel 之后立即调用 fetchMore() 实际上会导致以下 rowCount() 调用返回正确的值。但是一旦数据库中的某些内容发生了变化(我的类将在 QSqlTableModel 上调用 insertRow() 或 setData()),下一个 QSqlTableModel::rowCount() 调用将再次返回 256。
数据库仅由我的类修改,而我的类又使用该特定的 QSqlTableModel 对象(或使用我的 DataTable 作为模型的视图可以更新某些内容)。所以没有其他进程可以将行插入数据库。
那么我的 DataTable 类何时应该为 rowCount() 调用 fetchMore() 以始终返回实际的行数?
我在想我的班级应该将 QSqlTableModel 发出的一些信号连接到一个可以调用 fetchMore() 的插槽,尽管我不确定这是否是正确/可靠的方法?
更新:
这是一些代码来演示基本问题。
加载 sql 模型后,rowCount() 返回 256 (1),因此必须调用 fetchMore()。rowCount() 然后返回实际的行数。
稍后,数据被更改,之后 rowCount() 再次返回 256 (3)。
所以似乎 fetchMore() 必须在 sql 模型上的每次写入操作之后调用。但与其将这个 while/canFetchMore()/fetchMore() 循环放在修改模型的每个方法的末尾,我想知道连接 beforeInsert(QSqlRecord&)、beforeUpdate(int, QSqlRecord&) 和beforeDelete(int) 向一个插槽发出信号,然后调用 fetchAll()?这会是可靠和适当的吗?
更正:不是 before* 信号(太早),但可能是 layoutChanged()、dataChanged()、rowsInserted() 和 rowsRemoved()。
更新 2:
关于 SQL 的注意事项:我知道SELECT COUNT
理论上我可以向数据库发送单独的 SQL 查询,但这并不能回答问题。只要能避免SQL,我就不会写SQL。在我看来,发送这样的 SQL 查询违背了面向对象的 QAbstractTableModel 类的目的。加上 rowCount() 是 const (不应该发送查询)并且应该很快。无论如何,这不会修复 rowCount()。
我最终将一个调用 fetchMore() 的插槽连接到相关信号(见上文)并断言所有内容都已在 rowCount() 中获取:
assert(!sql_model->canFetchMore())
这是因为 rowCount() 无法向我报告正确的行数计数为失败状态,因此断言。换句话说,我宁愿我的应用程序崩溃也不愿使用不正确的行数。
仅将其连接到 dataChanged() 信号(如第一个答案中所建议的:)I would probably try to use dataChanged signal.
是不够的。我已将其连接到dataChanged(const QModelIndex&, const QModelIndex&)
、rowsInserted(const QModelIndex&, int, int)
和。rowsRemoved(const QModelIndex&, int, int)
layoutChanged()
似乎有效,断言还没有失败。
如果有人可以特别确认这一点(或解释为什么它并不总是有效),我将不胜感激。