1

如何按PyQt4.QtSql模块从 SQL Server 获取最后插入行的 ID?现在我使用的是 SQL Server 2012 Express,但程序也必须在 SQL Server 2000 上运行。

这是我的代码(Python + PyQt)和结果:

from PyQt4.QtGui import QApplication
from PyQt4 import QtSql

app = QApplication([])
db = QtSql.QSqlDatabase.addDatabase("QODBC")
db.setDatabaseName('Driver={SQL Server Native Client 11.0};Server=(localdb)\\v11.0;')
db.open()

query = QtSql.QSqlQuery()
query.prepare("""CREATE TABLE Test(
    ID INT PRIMARY KEY IDENTITY(1, 1),
    Row nvarchar(255)
)
""")
query.exec_()

query = QtSql.QSqlQuery()
query.prepare('INSERT Test OUTPUT Inserted.ID VALUES(?)')
query.bindValue(0, 'Test')

query.exec_()

while query.next():
    last_inserted_id = query.value(0)

print('OUTPUT: ', last_inserted_id)
print('QSqlQuery.lastInsertId: ', query.lastInsertId())

query = QtSql.QSqlQuery('SELECT SCOPE_IDENTITY()')

while query.next():
    last_inserted_id_ = query.value(0)

print('SCOPE_IDENTITY: ', last_inserted_id_)

db.close()

结果:

OUTPUT:  1
QSqlQuery.lastInsertId:  None
SCOPE_IDENTITY:  <PyQt4.QtCore.QPyNullVariant object at 0x00000000032D88D0>

不幸OUTPUT的是,SQL Server 2005 或更高版本支持 Clause。

Python 3.2.3 (x64)、PyQt 4.9.4、SQL Server 2012 Express

有任何想法吗?

编辑:

到目前为止,我使用SELECT @@IDENTITY.

4

2 回答 2

2

将我的评论移至答案以允许干净地关闭它:

我不知道 Python,但我认为 SCOPE_IDENTITY() 只能在批处理中工作。因此,您可能希望使用 INSERT 将 ;SELECT SCOPE_IDENTITY() 添加到查询中。希望这可以帮助。

所以你的插入可能看起来像:

query = QtSql.QSqlQuery() 
query.prepare('INSERT Test VALUES(?); SELECT SCOPE_IDENTITY()') 
query.bindValue(0, 'Test') 

query.exec_() 

while query.next(): 
    last_inserted_id = query.value(0) 
于 2012-07-23T18:21:14.773 回答
1

QSqlQuery 类有一个 lastInsertId 方法,它返回最后插入的行的 id。

query = QtSql.QSqlQuery() 
query.exec_('INSERT Test (id, name) VALUES(1, 'Test')')

# Get the ID of the last inserted row
query.lastInsertId() # Output : 1
于 2017-11-05T13:46:17.497 回答