使用QSqlQuery检索SCOPE_IDENTITY()

时间:2011-10-17 10:14:25

标签: sql-server database 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();

返回false。它是qt的错误还是我的范围Identity语句错误。我非常感谢别人的帮助。

谢谢。

2 个答案:

答案 0 :(得分:5)

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

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

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

SQL:BatchCompleted

在SQL 2005及更高版本中,QSqlQuery scope_Identity("INSERT INTO person VALUES ('Wijethilake','Tharanga'); SELECT SCOPE_IDENTITY() AS Current_Identity;"); QSqlRecord rec = scope_Identity.record(); qDebug() << scope_Identity.isValid(); 的替代是SCOPE_IDENTITY()子句,它使您能够在一个语句中完成所有操作:

OUTPUT

答案 1 :(得分: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*);