Получение SCOPE_IDENTITY () с помощью QSqlQuery - PullRequest
2 голосов
/ 17 октября 2011
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();

Это возвращает ложь. Является ли это тем, что что-то не так с qt, или это неверно в моем заявлении об идентификации. Я действительно ценю чью-то помощь в этом.

Спасибо.

Ответы [ 2 ]

5 голосов
/ 17 октября 2011

Это может быть связано с тем, как работает 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();

В 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();
1 голос
/ 17 февраля 2012

Это не будет работать, если у человека есть триггер для вставки:

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*);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...