Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подключение к БД из динамической библиотеки
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Разработка баз данных
sanya
Добрый день,
Подскажите где читать (или примерчиком): надо все действия с подключением к БД вынести в динамическую библиотечку, как тогда юзать эту БД?
спасибо...
Litkevich Yuriy
а как бы ты юзал БД еслиб подключение создавалось, например, в файле connect.h а использовать надо в файле app.cpp, при этом первый приинклюден только к main.cpp?
sanya
Прошу прощения, но не совсем понимаю... (новичек я в С...)

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


Запустил. Подключился к БД, вижу таблички, запросы выполняются... :scratch_one-s_head:
Litkevich Yuriy
если приведенный код не полный, выкладывай полный тестовый код библиотеки и основной программы с pro-файлами
sanya
Цитата(Litkevich Yuriy @ 1.8.2008, 14:54) *
если приведенный код не полный, выкладывай полный тестовый код библиотеки и основной программы с pro-файлами

приведенный код полный, но вот архив со всеми оставшимися файлами...
Нажмите для просмотра прикрепленного файла
Litkevich Yuriy
касяк где-то в соединении т.к. у меня тоже пишет
==> 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
да, все работает, спасибки

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

скобки тут не причем, сначала ты проверяешь указатель, валидный или нет и только если валидный, тогда вызываешь функцию через указатель.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.