Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Разработка баз данных _ Подключение к БД из динамической библиотеки

Автор: sanya 31.7.2008, 15:01

Добрый день,
Подскажите где читать (или примерчиком): надо все действия с подключением к БД вынести в динамическую библиотечку, как тогда юзать эту БД?
спасибо...

Автор: Litkevich Yuriy 31.7.2008, 15:39

а как бы ты юзал БД еслиб подключение создавалось, например, в файле connect.h а использовать надо в файле app.cpp, при этом первый приинклюден только к main.cpp?

Автор: sanya 1.8.2008, 11:18

Прошу прощения, но не совсем понимаю... (новичек я в С...)

пробую таким образом:

исходники
main.cpp
#include <QtGui>
#include <QtSql>

int main(int argc, char* argv[]) {
    QApplication app (argc, argv);

    QLibrary libdb("../db/bin/libdb");
    if (libdb.load()) {
        qDebug() << "==> main.cpp - libdb ok";
    } else {
        qDebug() << "==> main.cpp - libdb bad" << libdb.errorString();
    }
    
    typedef bool (*Fct) ();
    Fct fct = (Fct)(libdb.resolve("createConnections"));
    if (fct) {
        qDebug() << "==> main.cpp - connect ok";
    } else {
        qDebug() << "==> main.cpp - connect bad";
    }
    
    QSqlDatabase db = QSqlDatabase::database("psql");
    if ( !db.open() ) {
        qDebug() << "Failed to open database: " << db.lastError().driverText();
    }
}


db.cpp
#include "db.h"

bool createConnections()
{
    QSqlDatabase db = QSqlDatabase::addDatabase( "QPSQL", "psql" );
    db.setDatabaseName( "ArisPSQLBase" );
    db.setUserName( "sanya" );
    db.setPassword( "*****" );
    db.setHostName( "192.168.87.1" );
    if ( !db.open() ) {
        qDebug() << "Failed to open database: " << db.lastError().driverText();
        return FALSE;
    }
    return TRUE;
}


db.h
#ifndef __DB_H__
#define __DB_H__
#include <QtSql>

extern "C" {
    bool createConnections();
}

#endif // __DB_H__


а в консоле вижу:
==> main.cpp - libdb ok
==> main.cpp - connect ok
Failed to open database: "Driver not loaded"

то есть, в библиотечке коннект происходит, а в основной программе нет... в чем я не прав и как быть?

Автор: Litkevich Yuriy 1.8.2008, 13:22

запусти демку %QTDIR%\demos\sqlbrowser и посмотри подключается она к твоей БД или нет (о результатах отпишись)

Автор: sanya 1.8.2008, 14:06

Цитата(Litkevich Yuriy @ 1.8.2008, 13:22) *
запусти демку %QTDIR%\demos\sqlbrowser и посмотри подключается она к твоей БД или нет (о результатах отпишись)


Запустил. Подключился к БД, вижу таблички, запросы выполняются... :scratch_one-s_head:

Автор: Litkevich Yuriy 1.8.2008, 14:54

если приведенный код не полный, выкладывай полный тестовый код библиотеки и основной программы с pro-файлами

Автор: sanya 1.8.2008, 15:24

Цитата(Litkevich Yuriy @ 1.8.2008, 14:54) *
если приведенный код не полный, выкладывай полный тестовый код библиотеки и основной программы с pro-файлами

приведенный код полный, но вот архив со всеми оставшимися файлами...
 test.tar.gz ( 3.22 килобайт ) : 423

Автор: Litkevich Yuriy 1.8.2008, 16:26

касяк где-то в соединении т.к. у меня тоже пишет
==> main.cpp - libdb ok
==> main.cpp - connect ok
хотя у меня нет ни базы ни постгреэскуэль
поковыраю еще может что найду

похоже косяк найден, у меня БД нет проверяй сам:

    Fct fct = (Fct)(libdb.resolve("createConnections"));
    if (fct)
    {
        fct();    // <<<<  Вызов самой функции

        qDebug() << "==> main.cpp - connect ok";
    }
    else
    {
        qDebug() << "==> main.cpp - connect bad";
    }


Функцию вызвать забыл!!!

кусок кода надо тепрь модифицировать с учетом возвращаемого значения, например так:
    typedef bool (*Fct) ();
    Fct fct = (Fct)(libdb.resolve("createConnections"));
    if (fct)
    {
        if (fct())
        {
            qDebug() << "==> main.cpp - connect ok";
        }
        else
        {
            qDebug() << "==> main.cpp - connect bad";
        }
    }
    else
    {
        return 1;
    }

Автор: sanya 1.8.2008, 19:43

да, все работает, спасибки

скобки забыл... :fool:

Автор: Litkevich Yuriy 1.8.2008, 19:50

Цитата(sanya @ 1.8.2008, 23:43) *
скобки забыл...

скобки тут не причем, сначала ты проверяешь указатель, валидный или нет и только если валидный, тогда вызываешь функцию через указатель.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)