crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Подключение к БД из динамической библиотеки
sanya
  опции профиля:
сообщение 31.7.2008, 15:01
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 31.7.2008
Из: Рамбов
Пользователь №: 246

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день,
Подскажите где читать (или примерчиком): надо все действия с подключением к БД вынести в динамическую библиотечку, как тогда юзать эту БД?
спасибо...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.7.2008, 15:39
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


а как бы ты юзал БД еслиб подключение создавалось, например, в файле connect.h а использовать надо в файле app.cpp, при этом первый приинклюден только к main.cpp?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sanya
  опции профиля:
сообщение 1.8.2008, 11:18
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 31.7.2008
Из: Рамбов
Пользователь №: 246

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

пробую таким образом:
исходники
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"

то есть, в библиотечке коннект происходит, а в основной программе нет... в чем я не прав и как быть?
Причина редактирования: можно использовать тэг expand в качестве обертки тэга code=cpp
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.8.2008, 13:22
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


запусти демку %QTDIR%\demos\sqlbrowser и посмотри подключается она к твоей БД или нет (о результатах отпишись)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sanya
  опции профиля:
сообщение 1.8.2008, 14:06
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 31.7.2008
Из: Рамбов
Пользователь №: 246

Спасибо сказали: 0 раз(а)




Репутация:   0  


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


Запустил. Подключился к БД, вижу таблички, запросы выполняются... :scratch_one-s_head:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.8.2008, 14:54
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


если приведенный код не полный, выкладывай полный тестовый код библиотеки и основной программы с pro-файлами
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sanya
  опции профиля:
сообщение 1.8.2008, 15:24
Сообщение #7


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 31.7.2008
Из: Рамбов
Пользователь №: 246

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

приведенный код полный, но вот архив со всеми оставшимися файлами...
Прикрепленный файл  test.tar.gz ( 3,22 килобайт ) Кол-во скачиваний: 444
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.8.2008, 16:26
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


касяк где-то в соединении т.к. у меня тоже пишет
==> 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
Сообщение #9


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 31.7.2008
Из: Рамбов
Пользователь №: 246

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

скобки забыл... :fool:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.8.2008, 19:50
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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

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

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.12.2024, 14:07