Russian Qt Forum

Qt => Вопросы новичков => Тема начата: sinj от Март 01, 2011, 23:08



Название: Нужна помощь с SQLite
Отправлено: sinj от Март 01, 2011, 23:08
Собственно есть вот такой вот код. Есть окошко в нем есть две кнопки. По нажатию на одну окошко должно закрываться, а по нажатию на вторую должны добавляться данные в таблице. Долго ковырялся, не могу понять, почему база создается, а данные в нее не добавляются. Посмотрите, может кто найдет ошибки и посоветует, в какую сторону искать. Пользовался ассистентом, но походу где-то не разобрался.

Код:
#include <QDate>
#include <QtSql>
#include "mainwindow.h"
#include "ui_mainwindow.h"

void DBaddData()
{
    QSqlDatabase myBase=QSqlDatabase::addDatabase("QSQLITE");
    myBase.setDatabaseName("allDataODKO");
    myBase.open();
    QSqlQuery myquery;
    myquery.exec("create table pDB(id int primary key,PCA int)");
    myquery.exec("insert into pDB(id,PCA) values(12,212)");
}


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //----------
    QDate dateNow=QDate::currentDate();
    ui->lineEdit_20->setText(dateNow.toString("dd.MM.yyyy"));
    //----------
}

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

void MainWindow::on_pushButton_2_clicked()
{
    //это кнопка выхода из программы
    close();
}

void MainWindow::on_pushButton_clicked()
{
    //функция нажатия на кнопку внесения
    DBaddData();
}


Название: Re: Нужна помощь с SQLite
Отправлено: alexman от Март 01, 2011, 23:13
А таблица то pDB создана? QSqlQuery myquery; - без параметров создаете ???


Название: Re: Нужна помощь с SQLite
Отправлено: sinj от Март 01, 2011, 23:15
А как надо правильно?


Название: Re: Нужна помощь с SQLite
Отправлено: developer от Март 02, 2011, 04:43
myquery.exec("create table pDB(id int primary key,PCA int)");
myquery.exec("insert into pDB(PCB,PCA) values(12,212)");


Поле в таблице то "id", а ты используеш PCB. А вообще-то есть функции lastQuery(), lastError().


Название: Re: Нужна помощь с SQLite
Отправлено: sinj от Март 02, 2011, 07:13
Таблица создана. Но все равно данные не добавляются... Поправил код. Не могу разобраться что я делаю неправильно. Таблица создается. В консоли креатор пишет "QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed". Пытался удалить соединение разными способами, но видимо неправильно. Как оно должно удаляться? Делал myBase.close(); потом делал myBase.removeConnection();


Название: Re: Нужна помощь с SQLite
Отправлено: alexman от Март 02, 2011, 08:49
Ну и? Разобрался?


Название: Re: Нужна помощь с SQLite
Отправлено: sinj от Март 03, 2011, 14:03
Нет, разобраться не получается. Написал вот такую вот функцию:
Код:
void DBTestConn()
{
    QSqlQuery myquery;
    QSqlDatabase myBase=QSqlDatabase::addDatabase("QSQLITE","myCONNECTION");
    myBase.setDatabaseName("D:/allDataODKO.db");
    myBase.open();
    myquery.exec("create table pDB (id integer primary key,PCA integer)");
    myquery.exec("insert into pDB values(1,2)");
    myBase.close();
    myBase.removeDatabase("myCONNECTION");
}

Эту функцию вызываю при нажатии на кнопку. В результате база создается, но она пустая, а в консоли Qt пишет мне:
Цитировать
QSqlQuery::exec: database not open
QSqlQuery::exec: database not open
QSqlDatabasePrivate::removeDatabase: connection 'myCONNECTION' is still in use, all queries will cease to work.

Уже перепробовал все комбинации. Кто поможет добавить в базу данные?))) Посмотрел пример в ассистенте, написал как там.


Название: Re: Нужна помощь с SQLite
Отправлено: Пантер от Март 03, 2011, 14:07
Код
C++ (Qt)
void DBCreate()
{
   QSqlDatabase myBase=QSqlDatabase::addDatabase("QSQLITE");
   myBase.setDatabaseName("D:/allDataODKO.db");
   if (!myBase.open()) {
       qDebug () << myBase.lastError ().text ();
   } else {
       QSqlQuery myquery;
       myquery.exec("create table pDB (id integer primary key,PCA integer)");
       const boo result = myquery.exec("insert into pDB values(1,2)");
       if (!result) {
           qDebug () << myquery.lastError ().text ();
       }
   }
   myBase.close ()
}
 
Но не вешай это на кнопку, так как это должно отработать только один раз.


Название: Re: Нужна помощь с SQLite
Отправлено: sinj от Март 03, 2011, 14:47
Вопрос решил следующим образом:
Код:
void DBTestConn()
{
    QSqlDatabase myBase=QSqlDatabase::addDatabase("QSQLITE","myCONNECTION");
    myBase.setDatabaseName("allDataODKO.db");
    myBase.open();
    QSqlQuery myquery(myBase);
    myquery.exec("create table pDB (id int,PCA int)");
    myquery.exec("insert into pDB values(1,2)");
    myBase.close();
    myBase.removeDatabase("myCONNECTION");
}
Оказалось, что квери необходимо создавать после установления соединения, и после привязки его к соединению
Код:
QSqlQuery myquery(myBase);
в моем случае все заработало. Привинтил к кнопке, но теперь у меня не удаляется соединения. говорит что занято, помогите разобраться? Спасибо за ответы.


Название: Re: Нужна помощь с SQLite
Отправлено: sinj от Март 03, 2011, 14:56
Разобрался. Вот код. Возможно кому-то поможет.
Код:
    
void DBTestConn()
{
        QSqlDatabase myBase=QSqlDatabase::addDatabase("QSQLITE","myCONNECTION");
        myBase.setDatabaseName("allDataODKO.db");
        myBase.open();
        QSqlQuery myquery(myBase);
        myquery.exec("create table pDB (id int,PCA int)");
        myquery.exec("insert into pDB values(1,2)");
        myBase.close();
    }
    QSqlDatabase::removeDatabase("myCONNECTION");
Если удалять соединение так, то все отлично!