2011-10-17 79 views
2
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(); 

这将返回false。是qt有问题还是我的范围身份声明错误。我真的很感谢有人在这方面的帮助。使用QSqlQuery检索SCOPE_IDENTITY()

谢谢。

+0

Upvoted。 +1 :-) –

回答

5

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

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

假设这是问题,您需要在同一范围内执行两个语句以返回新身份。我不知道这是否是有效的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(); 

在SQL 2005及更高版本,以SCOPE_IDENTITY()另一种是OUTPUT条款,使你做这件事的一个说法:

+0

非常感谢你的回复,我必须告诉你,你的问题的第二部分帮助了我。 – Tharanga

1

如果人有将任何触发这是行不通的:

QSqlQuery scope_Identity("INSERT INTO person OUTPUT inserted.IdTable 
    VALUES ('Wijethilake','Tharanga');"); 

我不知道为什么,这是行不通的:

QSqlQuery scope_Identity("INSERT INTO person VALUES 
    ('Wijethilake','Tharanga'); SELECT SCOPE_IDENTITY() AS 
    Current_Identity;"); 

你可以这样说:

QString query("**some_query_to_insert; some_query_to_select_with_SCOPE_IDENTITY()**"); 
QSqlQuery sql(QSqlDatabase::database()); 
sql.exec("**EXEC('**"+query+"**')**"); 
sql.next(); 
QVariant v = sql.value(*n*);