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

Qt';s的odbc驱动程序不支持mysql的LastInsertId,解决方法是什么?,mysql,qt,odbc,last-insert-id,Mysql,Qt,Odbc,Last Insert Id,Im使用Qt4.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().toStr

Im使用Qt4.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();
最好的解决办法是什么


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

您可以执行以下操作:

query.exec("SELECT id FROM myTable ORDER BY id DESC LIMIT 1");
要获取表中最大的id,应该是刚刚插入的id


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

您可以执行以下操作:

query.exec("SELECT id FROM myTable ORDER BY id DESC LIMIT 1");
要获取表中最大的id,应该是刚刚插入的id

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

根据,您可以调用:

SELECT LAST_INSERT_ID();
执行insert查询以获取为当前连接插入的最新id后,即使使用ODBC。

根据,您也可以调用:

SELECT LAST_INSERT_ID();

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

使用插入的输出。[字段名]如下代码所示。 使用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;
bool repeatsrecogner::InsertEvent(RepEvent*事件){
QSqlDatabase db=AppManager::db_Output()->ThreadDatabase();
QSqlQuery查询(db);
prepare(“插入到RepEvents(ChannelID,StatsRangeUID,MinStartDateTime,MaxDuration,Fixed)输出INSERTED.ID”
“值(?,?,?,?)”;
query.bindValue(0,事件->通道ID);
bindValue(1,事件->statRangeUID.toString());
query.bindValue(2,事件->MinStartDateTime);
query.bindValue(3,事件->最大持续时间);
query.bindValue(4,false);
如果(!query.exec())
返回false;
如果(!query.next())
返回false;
event->ID=query.value(0.toLongLong();

qDebug()使用插入的输出。[字段名]如下代码所示。 使用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;
bool repeatsrecogner::InsertEvent(RepEvent*事件){
QSqlDatabase db=AppManager::db_Output()->ThreadDatabase();
QSqlQuery查询(db);
prepare(“插入到RepEvents(ChannelID,StatsRangeUID,MinStartDateTime,MaxDuration,Fixed)输出INSERTED.ID”
“值(?,?,?,?)”;
query.bindValue(0,事件->通道ID);
bindValue(1,事件->statRangeUID.toString());
query.bindValue(2,事件->MinStartDateTime);
query.bindValue(3,事件->最大持续时间);
query.bindValue(4,false);
如果(!query.exec())
返回false;
如果(!query.next())
返回false;
event->ID=query.value(0.toLongLong();

谢谢你的建议。我会研究锁桌子的问题。谢谢你的建议。我会研究锁桌子的问题。