【问题标题】:Qt's odbc driver does not support LastInsertId with mysql, whats the workaround?Qt 的 odbc 驱动程序不支持 mysql 的 LastInsertId,有什么解决方法?
【发布时间】:2012-11-22 10:41:45
【问题描述】:

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

最好的解决方法是什么?

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

【问题讨论】:

    标签: mysql qt odbc last-insert-id


    【解决方案1】:

    根据MySQL documentation,可以拨打:

    SELECT LAST_INSERT_ID();
    

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

    【讨论】:

      【解决方案2】:

      你可以这样做:

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

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

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

      【讨论】:

      • 感谢您的建议。我会考虑锁定桌子。
      【解决方案3】:

      使用 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;
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-17
        • 1970-01-01
        • 2015-01-09
        • 1970-01-01
        • 2013-09-06
        • 2012-03-08
        • 1970-01-01
        • 2023-03-24
        相关资源
        最近更新 更多