为什么QSqlQuery :: next()会触发向量越界?

时间:2017-07-20 15:41:47

标签: c++ sql qt db2 odbc

我的问题与2010年的this问题非常相似,除了一件事:

我的代码未在任何地方设置setForwardOnly(true)

这是:

QSqlQuery query(this->query);
while (query.next()) {
    for (size_t i = 0; i < 15; i++)
    {
        tmp.append(query.value(i).toString());
    }
    this->out.append(tmp);
    tmp.clear();
} <- exception here

我的代码没有写出容器边界,我已经三次检查了。

无论如何,我得到了这个例外:

exception

然而,查询正在后台运行,但这个烦人的窗口会导致用户体验不佳。

任何人都可以解释我应该怎样做才能消除此异常的原因?

这是最小的例子:

#include "mainwindow.h"
#include <QApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QSqlDriver>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    QSqlRecord rec;
    QVector<QStringList> out;
    QStringList tmp;
    QSqlDriver *drv;
    QSqlDatabase db;
    db = QSqlDatabase::addDatabase("QODBC");
    db.setDatabaseName("MYODBCSRC");

    QString table_name = "LIBRARY.TABLE";

    QString myquery = "select * from LIBRARY.TABLE";

    if(db.open("LOGIN","PASSWORD"))
    {
        drv = db.driver();
        rec =drv->record(table_name);
        qint64 outputRowCount = rec.count();

        QSqlQuery query(myquery);
        while (query.next()) {
            for (size_t i = 0; i < outputRowCount; i++)
            {
                tmp.append(query.value(i).toString());
            }
            out.append(tmp);
            tmp.clear();
        }
    }
    return a.exec();
}

这是我的stacktrace:

1   QListData::size                        qlist.h                 113  0x662a3651 
2   QList<QString>::length                 qlist.h                 343  0x11e9650  
3   myproj::on_pushButton_4_clicked        myproj.cpp              171  0x11e378f  
4   myproj::qt_static_metacall             moc_myproj.cpp          130  0x11f4dba  
5   myproj::qt_metacall                    moc_myproj.cpp          188  0x11f4c8b  
6   QMetaObject::metacall                  qmetaobject.cpp         302  0x6656c7d0 
7   QMetaObject::activate                  qobject.cpp             3755 0x665a7e35 
8   QMetaObject::activate                  qobject.cpp             3602 0x665a77d1 
9   QAbstractButton::clicked               moc_qabstractbutton.cpp 309  0x56ceeceb 
10  QAbstractButtonPrivate::emitClicked    qabstractbutton.cpp     413  0x56cf0587 
11  QAbstractButtonPrivate::click          qabstractbutton.cpp     405  0x56cefb1b 
12  QAbstractButton::mouseReleaseEvent     qabstractbutton.cpp     1010 0x56cef352 
13  QWidget::event                         qwidget.cpp             8781 0x56bd7c8d 
14  QAbstractButton::event                 qabstractbutton.cpp     967  0x56ceeec1 
15  QPushButton::event                     qpushbutton.cpp         676  0x56dbe34b 
16  QApplicationPrivate::notify_helper     qapplication.cpp        3745 0x56b8a2db 
17  QApplication::notify                   qapplication.cpp        3219 0x56b86ab8 
18  QCoreApplication::notifyInternal2      qcoreapplication.cpp    988  0x66560ccc 
19  QCoreApplication::sendSpontaneousEvent qcoreapplication.h      234  0x666890f8 
20  QApplicationPrivate::sendMouseEvent    qapplication.cpp        2713 0x56b8bf93 

0 个答案:

没有答案