我正在使用:QT 5.0.2 + MinGW 4.7 + 32 位 + ODBC 驱动程序 + Windows 7 (32) + SQL Server 2012 Express
问题”:
1) 我有一个窗口显示数据库表中的记录。
2)如果在应用程序的某个地方,我必须在不使用“事务”的情况下更新数据库,一切正常。
3) 如果在应用程序的某个地方,我必须使用“事务”更新数据库,窗口 (1) (*) 中显示的记录消失并变成空白记录。
注意(*):如果我有更多的窗口(MDI)显示几个表,所有窗口,所有表记录同时变为空白。
我决定使用“SQL Server Profiler”检查当有人使用 QSqlTableModel\QSqlQueryModel 时服务器端会发生什么,我认为我已经“发现”了服务器上的(我的)问题,但我不确定我 / QT 上的问题到底出在哪里边:
1)当窗口打开时,QSqlTableModel\QSqlQueryModel(我认为)在服务器上创建一个游标“exec sp_cursoropen 180150003”
2) 检索一些记录“exec sp_cursorfetch 180150003”</p>
3) 如果窗口重绘/刷新再次检索到一些记录“exec sp_cursorfetch 180150003”
4)在执行“事务”后,某人(谁?)关闭了 QSqlTableModel\QSqlQueryModel “exec sp_cursorclose 180150003”正在使用的游标(我认为)</p>
5) 之后,不再有“exec sp_cursorfetch...”的条目。这就是(我认为)QTableView 显示空白记录的原因。
注意 (*):当使用 MDI 子窗口时,每个子窗口都会显示一个完全不同且不相关的表。在“事务”之后,所有子窗口/QTableView 自动显示空白记录。我检查了“SQL Server Profiler”,在“事务”之后,“exec sp_cursorfetch”与打开的子窗口一样多。
似乎所有“游标”都会自动关闭,无论它们是否与正在进行的更新(单个表)相关。
假设“问题”是那些“exec sp_cursorclose”,有没有人知道为什么那些(exec sp_cursorclose)会自动发生:
它是 ODBC(一般来说)限制吗?
它是 ODBC(QT 实现)限制吗?
它是 ODBC(MSSQL 实现)限制吗?
它是 QSqlxxxxxx 实现/限制吗?
我在这里想念什么?
任何建议或意见将不胜感激