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语句错误。我非常感谢别人的帮助。
谢谢。
答案 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*);