Russian Qt Forum

Qt => Базы данных => Тема начата: crazymonkey от Июнь 19, 2014, 21:00



Название: QSqlQuery неожиданно падает
Отправлено: crazymonkey от Июнь 19, 2014, 21:00
Добрый день.
Есть вот такой код: по нажатию на кнопку код падает.

Код:

MainWindow::MainWindow(QWidget *parent) :  QMainWindow(parent), ui(new Ui::MainWindow)
{

    dbPostgres = &QSqlDatabase::addDatabase("QPSQL");
    dbPostgres->setHostName("localhost");
    dbPostgres->setDatabaseName("information_system");
    dbPostgres->setUserName("postgres");
    dbPostgres->setPassword("p@ssw0rd");
    bool ok = dbPostgres->open();

    ui->setupUi(this);

    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(addNewUser()));
    setListOfTables();
    setListOfUsers();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::setListOfTables()
{
    QSqlQuery *queryGetTables = new QSqlQuery(*dbPostgres);
    queryGetTables->exec("SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'");
    while(queryGetTables->next()){
        ui->textBrowser->append(queryGetTables->value(0).toString());
    }
}

void MainWindow::setListOfUsers()
{
    QSqlQuery *queryGetUsers = new QSqlQuery(*dbPostgres);
    queryGetUsers->exec("SELECT usename FROM pg_catalog.pg_user");
    auto k=0;
    while(queryGetUsers->next()){
        ui->comboBox->insertItem(k,queryGetUsers->value(0).toString());
        k++;
    }
}

void MainWindow::addNewUser()
{
    QSqlQuery *addNewUsers = new QSqlQuery(*dbPostgres);
    QString currentEditedUser = ui->lineEdit->text();
    if (currentEditedUser == ""){
        QMessageBox::information(this,"Information","Can't create user without name",QMessageBox::Ok);
        return;
    }
    databaseUsers->append(currentEditedUser);
    addNewUsers->exec("CREATEUSER " + currentEditedUser);
}

Функции выборки пользователей и таблиц отрабатывают, а вот по нажатию на кнопу происходит падение.


Название: Re: QSqlQuery неожиданно падает
Отправлено: Old от Июнь 19, 2014, 21:09
На сколько я вижу, в конструкторе addDatabase возвращает временный объект соединения.
Вы берете его адрес и используете. После завершения конструктора, временный объект разрушается и указатель начинает указывать на разрушенный объект.
Посмотрите в документации и примерах, как нужно работать с соединениями QSqlDatabase.


Название: Re: QSqlQuery неожиданно падает
Отправлено: crazymonkey от Июнь 19, 2014, 21:13
Да уж. Прошляпил такую простую штуку :)