Russian Qt Forum

Qt => Базы данных => Тема начата: gidrowolf от Ноябрь 15, 2009, 22:29



Название: Что я неправильно делаю в простейшем коде?
Отправлено: gidrowolf от Ноябрь 15, 2009, 22:29
Вот код содранный из примера, но в примере все работает а у меня нет.
Цитировать
#include <QtSql>
#include <QMessageBox>
#include "test.h"
#include "ui_test.h"

QSqlDatabase db;
QSqlQuery query;
QSqlRelationalTableModel model;

test::test(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::test)
{
    ui->setupUi(this);
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");
    if (!db.open()) {
        QMessageBox::critical(0, qApp->tr("Cannot open database"),
            qApp->tr("Unable to establish a database connection.\n"
                     "Click Cancel to exit."), QMessageBox::Cancel);
    }
   
    query.exec("create table employee(id int primary key, name varchar(20), city int, country int)");
    query.exec("insert into employee values(1, 'Espen', 5000, 47)");
    query.exec("insert into employee values(2, 'Harald', 80000, 49)");
    query.exec("insert into employee values(3, 'Sam', 100, 1)");

    query.exec("create table city(id int, name varchar(20))");
    query.exec("insert into city values(100, 'San Jose')");
    query.exec("insert into city values(5000, 'Oslo')");
    query.exec("insert into city values(80000, 'Munich')");

    query.exec("create table country(id int, name varchar(20))");
    query.exec("insert into country values(1, 'USA')");
    query.exec("insert into country values(47, 'Norway')");
    query.exec("insert into country values(49, 'Germany')");

    model.setTable("employee");
    model.select();
    ui->tableView->setModel(&model);
}

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

Да еще какието ошибки непонятные:
Цитировать
Запускается G:\DATABASE\test\debug\test.exe...
QSqlQuery::exec: database not open
QSqlQuery::exec: database not open
QSqlQuery::exec: database not open
QSqlQuery::exec: database not open
QSqlQuery::exec: database not open
QSqlQuery::exec: database not open
QSqlQuery::exec: database not open
QSqlQuery::exec: database not open
QSqlQuery::exec: database not open
QSqlQuery::exec: database not open
QSqlQuery::exec: database not open
QSqlQuery::exec: database not open
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.

G:\DATABASE\test\debug\test.exe завершилась с кодом 0

Вроде все делаю как надо, и вроде как все элементарно. Чего я непонимаю?


Название: Re: Что я неправильно делаю в простейшем коде?
Отправлено: nixman05 от Ноябрь 15, 2009, 23:27
Вначале

Код
C++ (Qt)
QSqlQuery *query;
 


После открытия базы
Код
C++ (Qt)
query=new QSqlQuery(db);
query->exec("create .... ");
 


Название: Re: Что я неправильно делаю в простейшем коде?
Отправлено: Makss от Ноябрь 15, 2009, 23:34
эти варнинги что вивелись, они выводятся вот в этих строках кода
Код:
query.exec("create table employee(id int primary key, name varchar(20), city int, country int)");
    query.exec("insert into employee values(1, 'Espen', 5000, 47)");
    query.exec("insert into employee values(2, 'Harald', 80000, 49)");
    query.exec("insert into employee values(3, 'Sam', 100, 1)");

    query.exec("create table city(id int, name varchar(20))");
    query.exec("insert into city values(100, 'San Jose')");
    query.exec("insert into city values(5000, 'Oslo')");
    query.exec("insert into city values(80000, 'Munich')");

    query.exec("create table country(id int, name varchar(20))");
    query.exec("insert into country values(1, 'USA')");
    query.exec("insert into country values(47, 'Norway')");
    query.exec("insert into country values(49, 'Germany')");

в варнингах написано что база не была открыта

Лудше QSqlQuery делать локальной переменной, т.к. они у вас обе глобальные,
Код:
QSqlDatabase db;
QSqlQuery query;
думаю как раз из-за этого и выводятся те сообщения... хотя это догадки всего лишь, но на счёт перенести "QSqlQuery query" в конструктор вашего окна я советовал бы попробовать


Название: Re: Что я неправильно делаю в простейшем коде?
Отправлено: gidrowolf от Ноябрь 15, 2009, 23:52
Вначале

Код
C++ (Qt)
QSqlQuery *query;
 


После открытия базы
Код
C++ (Qt)
query=new QSqlQuery(db);
query->exec("create .... ");
 

Огромное спасибо, ты прям озарил меня  :).

Просто в примере "relationaltablemodel" нигде нет таких строчек и я думал еще откуда прога знает с какой БД я хочу работать. И как интерено работает пример "relationaltablemodel" без этого указания о_О.


Название: Re: Что я неправильно делаю в простейшем коде?
Отправлено: lit-uriy от Ноябрь 16, 2009, 04:41
>>И как интерено работает пример "relationaltablemodel" без этого указания о_О.
пытается работать с соединением по умолчанию.
соединение создаётся и открывается с помощью класса QSqlDataBase