Qt的odbc驱动程序不支持使用mysql的LastInsertId,是什么解决方法?

时间:2012-12-04 18:03:49

标签: mysql qt odbc last-insert-id

我正在使用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();

最佳解决方法是什么?

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

3 个答案:

答案 0 :(得分:2)

根据MySQL documentation,您可以致电:

SELECT LAST_INSERT_ID();

在插入查询之后获取为当前连接插入的最新ID,即使使用ODBC。

答案 1 :(得分:1)

您可以执行以下操作:

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

获取表格中最大的ID - 这应该是您刚刚插入的ID。

如果您正在编写可以拥有多个并发用户的应用程序,则必须考虑在表上创建锁定,然后在运行第二个查询后释放锁定。

答案 2 :(得分:1)

使用OUTPUT INSERTED。[字段名称],如下面的代码所示。 使用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;

}