2011-10-17 21 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*);