1

PyQt4.QtSqlモジュールごとにSQLServerから最後に挿入された行のIDを取得するにはどうすればよいですか?現在、SQL Server 2012 Expressを使用していますが、プログラムはSQLServer2000でも動作する必要があります。

これが私のコード(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>

残念ながら、OUTPUTClauseはSQLServer2005以降でサポートされています。

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クラスには、最後に挿入された行のIDを返すメソッドlastInsertIdがあります。

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 に答える