簡體   English   中英

QSqlQuery::lastInsertId 不適用於 MS Access

[英]QSqlQuery::lastInsertId doesn't work with MS Access

我使用 MS Access 數據庫 (.accdb),我需要插入一些數據,然后獲取最后插入的 ID。 當我使用QSqlQuery::lastInsertId方法時,我看到以下錯誤:
"QODBCResult::lastInsertId: not implemented for this DBMS" Error: ""
我嘗試使用SELECT @@IDENTITY和類似的表達式( SCOPE_IDENTITYIDENTITY_CURRENT ),但我得到了同樣的錯誤。
前段時間我在 VBA 中使用了SELECT @@IDENTITY並且有效。 所以這不是關於 MS Access,而是驅動程序?
當然,我可以寫SELECT MAX(ID) FROM table ,但我不確定它是否安全。
有沒有辦法讓最后插入的 ID 與 MS Access 數據庫一起使用?

UPD

我的代碼:


#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QSqlQuery>
#include <QString>

const QString DB_DRIVER = "QODBC";
const QString DB_DATABASE_NAME = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; DSN='';"
"DBQ=C:\\Users\\UserName\\Documents\\QtProjects\\Project\\DB.accdb";
const QString DB_USER_NAME = "root";
const QString DB_PASSWORD = "password";

int main(int argc, char* argv[])
{
    QSqlDatabase db = QSqlDatabase::addDatabase(DB_DRIVER);
    db.setDatabaseName(DB_DATABASE_NAME);
    db.setUserName(DB_USER_NAME);
    db.setPassword(DB_PASSWORD);

    if (!db.open()) {
        qDebug() << "Database connection failed: " << db.lastError();
    }

    QSqlQuery query;
    query.prepare("INSERT INTO Customers (Organization, Address, Contacts)"
                  "VALUES (:organization, :address, :contacts);");
    query.bindValue(":organization", "Some Organization");
    query.bindValue(":address", "Some Address");
    query.bindValue(":contacts", "Some contacts");
    if (!query.exec()) {
        qDebug() << "Error executing INSERT statement: " << query.lastError();
    }

    int newId = query.lastInsertId().toInt();
    qDebug() << QString("New ID is %1").arg(newId);
    qDebug() << "Last error: " << query.lastError();

    return 0;
}


完整輸出:
"QODBCResult::lastInsertId: not implemented for this DBMS" Error: ""
"New ID is 0"
Last error: QSqlError("", "", "")

我不認識您各種不成功示例中的語法。

SELECT MAX(ID) FROM table 將工作假設 ID 是增量的; 您對這是否“安全”的擔憂我不明白這是什么意思......

如果沒有可靠的遞增 ID 字段,那么通常會添加一個具有默認值 Now() 的日期/時間字段,這當然是遞增的 - 並使用該字段的最大值。

感謝@user9601301 的評論。 我只需要運行SELECT @@IDENTITY; INSERT查詢之后的單獨查詢中,它可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM