0

我使用 Qt 4.8.3 和 MySQL ODBC 3.51 驱动程序。驱动程序似乎不支持我这样测试的 LastInsertId:

db.driver()->hasFeature(QSqlDriver::LastInsertId)

我需要它来找到我刚刚插入的自动增量 ID

query.exec("INSERT INTO myTable (MyVal, Created) VALUES ('1', NOW())");
auto insertId = query.lastInsertId().toString();

最好的解决方法是什么?

编辑:多个客户端将同时访问此表。

4

3 回答 3

2

根据MySQL 文档,您可以调用:

SELECT LAST_INSERT_ID();

在插入查询之后获取为当前连接插入的最新 id,即使在使用 ODBC 时也是如此。

于 2012-12-05T02:22:04.390 回答
1

您可以执行以下操作:

query.exec("SELECT id FROM myTable ORDER BY id DESC LIMIT 1");

获得表中最大的 id - 这应该是您刚刚插入的那个。

如果您正在编写一个可以有多个并发用户的应用程序,您将不得不考虑在您的表上创建一个锁,然后在运行第二个查询后释放该锁。

于 2012-12-04T18:12:00.587 回答
1

使用 OUTPUT INSERTED.[Field Name],如下面的代码所示。使用 next() 函数读取返回的 ID。

bool RepeatsRecognizer::InsertEvent(RepEvent* event){
QSqlDatabase db = AppManager::DB_Output()->ThreadDatabase();
QSqlQuery query(db);
query.prepare("INSERT INTO RepEvents (ChannelID, StatsRangeUID, MinStartDateTime, MaxDuration, Fixed) OUTPUT INSERTED.ID"
              " VALUES (?, ?, ?, ?, ?)");
query.bindValue(0, event->ChannelID);
query.bindValue(1, event->StatsRangeUID.toString());
query.bindValue(2, event->MinStartDateTime);
query.bindValue(3, event->MaxDuration);
query.bindValue(4, false);


if (!query.exec())
    return false;

if (!query.next())
    return false;

event->ID = query.value(0).toLongLong();
qDebug() << __FUNCTION__ << "Event ID:" << event->ID;

}

于 2014-10-21T07:24:10.153 回答