【发布时间】:2013-06-04 20:29:17
【问题描述】:
我正在使用: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”
3) 如果窗口重绘/刷新再次检索到一些记录“exec sp_cursorfetch 180150003”
4) 在执行“事务”之后,某人(谁?)关闭了 QSqlTableModel\QSqlQueryModel “exec sp_cursorclose 180150003”正在使用的游标(我认为)
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 实现/限制吗?
我在这里错过了什么?
任何建议或cmets将不胜感激
【问题讨论】:
标签: sql-server qt odbc