使用QSqlQuery检索SCOPE_IDENTITY()

Tha*_*nga 2 database sql-server qt

bool ok = query.exec("CREATE TABLE person ( IdTable INTEGER IDENTITY(1,1) NOT NULL PRIMARY KEY, LastName varchar(255), FirstName varchar(255)  )");            
bool ok1 = query.exec("INSERT INTO person VALUES ('Wijethilake','Tharanga')");            
QSqlQuery scope_Identity("SELECT SCOPE_IDENTITY() AS Current_Identity;");
QSqlRecord rec = scope_Identity.record();
qDebug() << scope_Identity.isValid();
Run Code Online (Sandbox Code Playgroud)

这返回false.它是qt的错误还是我的范围Identity语句错误.我非常感谢有人帮忙.

谢谢.

Ed *_*per 5

这可能与QSqlQuery的运行方式有关.

我不知道QSqlQuery,但我SCOPE_IDENTITY()在其他语言中遇到了类似的问题,其中INSERT和SELECT SCOPE_IDENTITY()...语句在不同的范围内运行 - 这意味着INSERT无法访问结果SCOPE_IDENTITY()- 通常是因为它们是由数据作为动态SQL执行的访问层.您可以通过在数据库服务器上运行事件的SQL跟踪来验证这一点SQL:BatchCompleted.

假设这是问题,您需要在同一范围内执行两个语句以返回新标识.我不确定这是否是有效的QSqlQuery,但是类似的东西

QSqlQuery scope_Identity("INSERT INTO person VALUES ('Wijethilake','Tharanga'); SELECT SCOPE_IDENTITY() AS Current_Identity;");
QSqlRecord rec = scope_Identity.record();
qDebug() << scope_Identity.isValid();
Run Code Online (Sandbox Code Playgroud)

在SQL 2005及更高版本中,替代SCOPE_IDENTITY()是OUTPUT子句,它使您能够在一个语句中完成所有操作:

QSqlQuery scope_Identity("INSERT INTO person OUTPUT inserted.IdTable VALUES ('Wijethilake','Tharanga');");
QSqlRecord rec = scope_Identity.record();
qDebug() << scope_Identity.isValid();
Run Code Online (Sandbox Code Playgroud)