Russian Qt Forum

Qt => Базы данных => Тема начата: vallic от Апрель 25, 2010, 22:43



Название: Создание базы данных
Отправлено: vallic от Апрель 25, 2010, 22:43
Привет всем,я новичек в программировании...
задача следующая создать sqlite базу со связанными таблицами.
проблема следующая создается текстовый файл вместо базы и файлик пустой...я строил проект основываясь на примерах qt.Прошу указать мои ошибки.Заранее благодарю.
sqlitebase.pro
Код:
HEADERS += connect.h
QT += sql
SOURCES += main.cpp
connect.h
Код:
#ifndef CONNECT_H
#define CONNECT_H

#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>

static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("sqlitebook");

    if (!db.open())  {
        qDebug() << "Cannot open database:" << db.lastError();
        return false;
    }
    QSqlQuery query;
    query.exec(
    "create table DirInfo (id int primary key,"
                                             "idDir int,"
                                             "tag text(30),"
                                             "Value text(20),"
                                             "constraint fk_DirInfo_BookDir"
                                             "foreign key (idDir) references BookDir (idDir) on update cascade on delete cascade)"
    "create table BookDir (idDir int primary key,"
                                              "name text(20))"
    "create table FileDir (name text,"
                                             "idDir int,"
                                             "idFile int,"
                                             "constraint pkFileDir"
                                             "primary key (idDir, name),"
                                             "constraint fk_FileDir_BookDir"
                                             "foreign key (idDir) references BookDir (idDir) on update cascade on delete cascade,"
                                             "constraint fk_FileDir_BookFile"
                                             "foreign key (idFile) references BookFile (idFile) on update cascade on delete cascade)"
    "create table Bookfile (idFile int primary key, "
                                              "format text(20),"
                                              "md5 text(100), "
                                              "mainname text(20))"
    "create table BookAnnot (idAnnot int primary key,"
                                             "idBook int,"
                                             "annotType varchar(1),"
                                             "txt text(20),"
                                             "constraint fk_BookAnnot_Book_ins"
                                             "foreign key (idBook) references Bookinsr (idBook) on update cascade on delete cascade)"
    "create table Bookinsr (idBook int primary key,"
                                             "format text(20),"
                                             "md5 text(100),"
                                             "idFile int,"
                                             "origId int,"
                                             "constraint fk_Bookinsr_BookFile"
                                             "foreign key (idFile) references BookFile (idFile) on update cascade on delete cascade,"
                                             "constraint fk_Bookinsr_Book"
                                             "foreign key (origId) references Book (origId) on update cascade on delete cascade)");
return true;
}

#endif
main.cpp
Код:
#include <QtGui>
#include <QtSql>

#include "connect.h"

void initializeModel(QSqlTableModel *model)
{
    model->setTable("Book");
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->select();
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel lbl("Database create");
    lbl.show();
    if (!createConnection())
        return 1;

    QSqlTableModel model;

    initializeModel(&model);

    return app.exec();
}


Название: Re: Создание базы данных
Отправлено: jack_r от Апрель 25, 2010, 23:38
Лучше разделите запрос создание таблиц на несколько. Так будет проще искать ошибки в запросах. Затем проверяйте результат выполнения запроса и выводите сообщения о возможные ошибках выполнения запроса.
Код:
QSqlQuery query;
if (!query.exec("create table DirInfo (id int primary key,"
                                             "idDir int,"
                                             "tag text(30),"
                                             "Value text(20),"
                                             "constraint fk_DirInfo_BookDir " // здесь пропущен пробел
                                             "foreign key (idDir) references BookDir (idDir) on update cascade on delete cascade)")
  qWarning() << query.lastError();


Название: Re: Создание базы данных
Отправлено: vallic от Апрель 25, 2010, 23:48
Лучше разделите запрос создание таблиц на несколько. Так будет проще искать ошибки в запросах. Затем проверяйте результат выполнения запроса и выводите сообщения о возможные ошибках выполнения запроса.
Код:
QSqlQuery query;
if (!query.exec("create table DirInfo (id int primary key,"
                                             "idDir int,"
                                             "tag text(30),"
                                             "Value text(20),"
                                             "constraint fk_DirInfo_BookDir " // здесь пропущен пробел
                                             "foreign key (idDir) references BookDir (idDir) on update cascade on delete cascade)")
  qWarning() << query.lastError();

спасибо,кстати пробела в синтаксисе не нашел!
на одном из форумов мне было сделано замечание:
Код:
в файлах с расширением .h (headers) пишутся заголовки (объявления) функций и классов. Определения (тела) функций и классов пишутся в файлах с расширением cpp.
вроде бы у меня описано правильно или нет?


Название: Re: Создание базы данных
Отправлено: Marat(Qt) от Апрель 26, 2010, 00:30
То что вы выложили - баловство, а не программа. Если будете писать программу - пишите ее иначе. А именно - создавайте классы, их заголовки храните в .h файлах, а описания методов в .cpp


Название: Re: Создание базы данных
Отправлено: vallic от Апрель 26, 2010, 00:43
То что вы выложили - баловство, а не программа. Если будете писать программу - пишите ее иначе. А именно - создавайте классы, их заголовки храните в .h файлах, а описания методов в .cpp
уже яснее, но для начала подчеркиваю я новичек...и я основывался на примерах qt!
можете привести пример описания?


Название: Re: Создание базы данных
Отправлено: crossly от Апрель 26, 2010, 12:40
епть.... нельзя начинать учить язык с QT.... познакомьтесь для начала с с++ ....


Название: Re: Создание базы данных
Отправлено: lit-uriy от Апрель 26, 2010, 16:09
>>можете привести пример описания?
открой пример examples\sql\cachedtable\
там два файла:
tableeditor.cpp
tableeditor.h
В h-файле (заголовочнике) находится объявление класса TableEditor
А в cpp-файле - реализация (описание) класса TableEditor


Название: Re: Создание базы данных
Отправлено: vallic от Апрель 26, 2010, 19:24
епть.... нельзя начинать учить язык с QT.... познакомьтесь для начала с с++ ....
С++ я учил, основная работа моя была администрирование. Я забыл C++, пытаюсь вспомнить!
>>можете привести пример описания?
открой пример examples\sql\cachedtable\
там два файла:
tableeditor.cpp
tableeditor.h
В h-файле (заголовочнике) находится объявление класса TableEditor
А в cpp-файле - реализация (описание) класса TableEditor
ещё яснее стало,спасибо!


Название: Re: Создание базы данных
Отправлено: vallic от Апрель 26, 2010, 21:38
получается сделать надо не много наоборот!