Russian Qt Forum

Qt => Базы данных => Тема начата: discribe от Апрель 16, 2010, 14:27



Название: Можнo ли унаследовать класс от QSqlDataBase?
Отправлено: discribe от Апрель 16, 2010, 14:27
Доброго времени суток, дорогие товарищи. Я недавно начал осваивать работу с БД под QT и вот встала такая задачка создать отдельный класс для работы с БД (создать в нем методы под определенные запросы). Создал класс и унаследовал его от QSqlDataBase, но когда создаю экземпляр класса и пытаюсь создать соединение с БД выдается ошибка о несоответствии типов
вот пример кода как пытаюсь получить соединение    
workBaseDate *work_BD  = QSqlDatabase::addDatabase("QPSQL");
класс workBaseDate унаследован QSqlDataBase

Народ кто что знает помогите в этом разобраься


Название: Re: Можнл ли унаследовать класс от QSqlDataBase?
Отправлено: crossly от Апрель 16, 2010, 15:13
в чем смысл наследования.... для чего??


Название: Re: Можнл ли унаследовать класс от QSqlDataBase?
Отправлено: discribe от Апрель 16, 2010, 15:58
Смысл в том что бы иметь отдельный класс (скажем так отделить класс от основной программы и расширить его функционал), который работает с БД а также дописать определенные методы работы с базой данных. Допустим создали объект данного унаследованного класса и вызываем метод в который передаем какието параметры и, данный метод записывает из в определенную таблицу БД которую мы имеем. В настоящее время создаю класс обертку, в который передаются параметры подключения и внудли создан класс QsqlDataBase и работа происходит через него, но в связи с тем что надо каждый раз в этом классе создавать методы такиеже как в QsqlDataBase это, считаю я, не правильно.

Кстати также возник вопрос по поводу записи  и чтения массива в postgres. Вопрос в том как записать одномерный массив данных в postgres, предварительно не преобразуем его в строку вида {<значение>,<значение>,<значение>,..}  - для записи, ну и конечно как преобразовать из БД полученный массив в массив с++ не создавая разбор по строке?


Название: Re: Можнo ли унаследовать класс от QSqlDataBase?
Отправлено: crossly от Апрель 16, 2010, 17:52
в общем случае класс QSqlDatabase служит для контроля соединения с БД... о каком расширении функционала идет речь не совсем понятно....
Код:
workBaseDate *work_BD  = workBaseDate::addDatabase("QPSQL");


Название: Re: Можнo ли унаследовать класс от QSqlDataBase?
Отправлено: lit-uriy от Апрель 16, 2010, 19:43
Во-первых, метод QSqlDatabase::addDatabase, возвращает объект, а не указатель.
Во-вторых, если я не чего не путаю, то присваивать указателю на класс-наследника указатель на базовый класс нельзя. Т.е. запись типа:
DerivedClass * object = new BaseClass();
Можно только наоборот
BaseClass * object = new DerivedClass();


Название: Re: Можнo ли унаследовать класс от QSqlDataBase?
Отправлено: crossly от Апрель 16, 2010, 19:55
ничего не путаешь... :)


Название: Re: Можнo ли унаследовать класс от QSqlDataBase?
Отправлено: break от Апрель 16, 2010, 23:41
90% что можно обойтись агрегацией QSqlDatabase или даже просто созданием экхемпляра QSqlDatabase в нужных ф-ях вашего класса расширителя функционала.

И все таки интересно поконкретнее что за ф-ции хотите добавить?


Название: Re: Можнo ли унаследовать класс от QSqlDataBase?
Отправлено: lit-uriy от Апрель 17, 2010, 08:06
к сожалению у QSqlDatabase не правильное имя. По хорошему он должен называться QSqlConnection. Тогда бы у людей и лишних соблазнов не было. Т.к. этот класс представляет лишь соединение с БД, а не БД в целом.


Название: Re: Можнo ли унаследовать класс от QSqlDataBase?
Отправлено: BaltikS от Апрель 17, 2010, 15:15
lit-uriy, верно....с тобой согласен на все 100%. Как будто это из Delphi пошло, там тоже для установки соединения используется TDatabase...


Название: Re: Можнo ли унаследовать класс от QSqlDataBase?
Отправлено: discribe от Апрель 19, 2010, 08:22
Всем спасибо, тогда может подскажете как лучше сделать чтоб бы работу с БД в отдельный класс отнести? У меня только два варианта: 1) Создать класс в котором методы будут возвращать на основе определенных заданных параметров объект QSqlQuery и в основной программе выполнять этот запрос;   2) Как уже говорилось выше создать класс обертку в котором не возвращается объект запроса, а сразу записывается в БД. Возможно подскажете как отделить класс работы с БД от основной программы (допустим для того что бы в другой программе выполнять работу с этой же БД при минимальной переписи кода, просто переносом класса)?