C++ i lokalna baza danych Firebird

0

Cześć wszystkim,
Mam do napisania program, który przetwarza sporo danych (w txt to ok. 2GB) i najszybciej jest wykorzystać do tego celu bazę danych (częste wyszukiwanie różnych danych). Język SQL znam bardzo dobrze, c++ nieco gorzej. Znalazłem różne sterowniki np. Firebird_database_layer, IBPP, ODBC za pomocą których można się połączyć z poziomu c++ z bazą danych Firebird. Niestety jestem na tyle ułomny, że nie potrafię ich zastosować. Myślałem, że starczy dodać jakąś bibliotekę do kodu i to wszystko, jednak się przeliczyłem.
Jaki sterownik wg Was jest najlepszy i najprostszy w użyciu?
Używam DevC++

0

Czym jest podyktowany wybór Firebird'a?

0

Zarządzałem kiedyś bazą w Firebirdzie przez ibexpert i isql i wiem z czym to się je, ale równie dobrze może baza może być w sqlite albo MySQL albo jeszcze czymś innym.

0

Najłatwiejsza współpraca (na moje oko) MySQL przez Zeos.

1

Jak Qt wchodzi w grę to polecam go razem z SQLite3, wszystko działa z automatu.

0

_13th_Dragon, widziałem, że jest dużo tutoriali Zeos + delphi szkoda, że z c++ nic nie znalazłem. Ogólnie rzecz ujmując przydałby mi się jakiś działający przykład żebym mógł zobaczyć jak to wygląda i na bazie tego zrobić połączenie ze swoją bazą.
Szczur, Qt to całe środowisko programistyczne z bibliotekami służącymi do połączenia z bazą? Widziałem tutorial na YouTube, można to wykorzystać też w konsolowych aplikacjach?

0

Qt to całe środowisko programistyczne z bibliotekami służącymi do połączenia z bazą? Widziałem tutorial na YouTube, można to wykorzystać też w konsolowych aplikacjach?

W skrócie - tak.
Przykłady wykorzystania dla baz danych - http://doc.qt.io/qt-5/examples-sql.html

Można pisać również aplikacje konsolowe.

0
JorgeLorenzo99 napisał(a):

widziałem, że jest dużo tutoriali Zeos + delphi szkoda, że z c++ nic nie znalazłem. Ogólnie rzecz ujmując przydałby mi się jakiś działający przykład żebym mógł zobaczyć jak to wygląda i na bazie tego zrobić połączenie ze swoją bazą.
Ogólnie ZeosLib to jest:
The ZeosLib is a set of database components for MySQL, PostgreSQL, Interbase, Firebird, MS SQL, Sybase, Oracle and SQLite for Delphi, FreePascal/Lazarus, Kylix and C++ Builder.
i w zasadzie pod innymi środowiskami nie da się tego uruchomić, bo klasy ZeosLib dziedziczą po klasach VCL/LCL i nie uruchomisz tego np. na Visual Studio nie mówiąc już o DevC++.

0

W takim razie odpuszczę sobie Zeos (albo nauczę się delphi ;) )

Poczytam jeszcze o Qt, ale to pewnie dopiero po świętach, bo teraz na forum wszedłem tak "z doskoku". Może uda mi się coś z tego Qt wyczarować, chyba, ze ktoś ma jeszcze coś innego do polecenia?

0

Zamiast uczyć się Delphi wybierz darmowego Lazarusa. Ewentualnie w czystym C/C++ też są biblioteki mniej lub bardziej wygodne do dostępu do bazy Firebirda. Jednak nie ma co ukrywać, że model jaki daje Delphi/C++ Builder jest bardzo wygodny i podstawową wersję programu można wyklikać sobie np. w dzień.

0

Jeżeli musi to być pisane w C++ to NIE MA lepszej opcji niż Qt.

0

Rozumiem, że testowałeś wszystkie IDE oraz kompilatory, że tak autorytatywnie wypowiadasz swoje zdanie...

0

Rozumiem, że testowałeś wszystkie IDE oraz kompilatory, że tak autorytatywnie wypowiadasz swoje zdanie...

A co ma do tego IDE czy kompilator? =-=
Tu nie chodzi ani o IDE ani o kompilator tylko o biblioteki i integracje tego z c++. A ta jest najlepsza w przypadku Qt i SQLite. Jeżeli w założeniu jest że ma to być lokalna baza danych( i może to być sqlite ) oraz że projekt musi być pisany w c++ to tak jestem pewien że nie ma lepszej opcji niż skorzystanie z Qt.

IDE i kompilator zawsze możesz zmienić dlatego akurat to nie ma żadnego znaczenia.

0

Pod warunkiem, że nie potrzebujesz tworzyć GUI w C++ to nie ma sensu brnąć w Qt. Owszem, ta biblioteka zawiera masę dodatkowych modułów jak obsługa protokołów sieciowych czy SQLa. Ba! Możesz za jej pomocą podłączyć do bazy danych Firebirda. Niestety, ponieważ Qt próbuje być biblioteką "do wszystkiego" te dodatkowe moduły są często mocno ograniczone i w momencie kiedy chcesz uzyskać coś więcej niż podstawowy workflow przewidziany przez twórców biblioteki to zaczynają się schody. Jako przykład można podać upośledzoną obsługę transakcji w module do SQL.

Wracając do tematu. Jeśli już potrzebujesz połączyć się z Firebirdem z poziomu C++ to proponuję wykorzystać IBPP. Biblioteka jest stosunkowo niewielka, przenośna i nie ciągnie żadnych dodatkowych zależności. Na Windows jedyne czego wymaga do działania do biblioteka fbclient.dll (lub fbembed.dll). Niestety Firebird ma to do siebie, że posiada tragiczną dokumentację a raczej brak takowej w sensownej postaci. Tak więc jeśli zdecydujesz się na tę bazę danych to przygotuj się na przeczesywanie google w poszukiwaniu wiedzy.

0
Szczur napisał(a):

Tu nie chodzi ani o IDE ani o kompilator tylko o biblioteki i integracje tego z c++. A ta jest najlepsza w przypadku Qt i SQLite. Jeżeli w założeniu jest że ma to być lokalna baza danych( i może to być sqlite ) oraz że projekt musi być pisany w c++ to tak jestem pewien że nie ma lepszej opcji niż skorzystanie z Qt.
A ja bym powiedział, że wygodniej będzie użyć c++ Biuldera i np. ZeosLib. A nawet użyć standardowych komponentów i Firebirda. Też jest bardzo wygodne i co najważniejsze szybko się pisze. Może nawet lepiej niż w Qt.

0

Jakichś zaawansowanych rzeczy nie potrzebuje bo baza będzie prosta tylko 2 tabele, jedna z max 10 rekordami, a w drugiej rekordów będzie kilkadziesiąt jak nie kilkaset milionów, żadnych wyzwalaczy, żadnych procedur.

Mr.YaHooo napisał(a):

A nawet użyć standardowych komponentów i Firebirda.

Co masz na myśli?

0
JorgeLorenzo99 napisał(a):

Co masz na myśli?
Jak masz zainstalowane Delphi/C++ Builder to ma on już na pokładzie komponenty IBX. Co prawda ich autor oficjalnie nie wspiera Firebirda, a tylko Interbase i zapowiedział, że nie doda obsługi Firebirda. Ale z doświadczenia powiem Ci, że standardowe rzeczy działają poprawnie. Nie wiem jak w przypadku rzeczy specyficznych dla FB 3.0. Ale 2.5 działa bardzo ładnie z tymi komponentami.

0

Zacząłem kombinować z sqlite i kompilacja testowego programu:

#include <stdio.h>
#include <sqlite3.h> 

int main(int argc, char* argv[])
{
   sqlite3 *db;
   char *zErrMsg = 0;
   int rc;

   rc = sqlite3_open("test.db", &db);

   if( rc ){
      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
      return -1;
   }else{
      fprintf(stderr, "Opened database successfully\n");
   }
   sqlite3_close(db);
} 

zakończyło się błędami:

  [Linker Error] Unresolved external '_sqlite3_open' referenced from C:\USERS\PAWEL\DESKTOP\SQLITE\1.OBJ
  [Linker Error] Unresolved external '_sqlite3_errmsg' referenced from C:\USERS\PAWEL\DESKTOP\SQLITE\1.OBJ
  [Linker Error] Unresolved external '_sqlite3_close' referenced from C:\USERS\PAWEL\DESKTOP\SQLITE\1.OBJ 

w czym problem?

0

A pliczek *.lib jest dołączany do projektu?

0

Teraz już tak, dziękuję.
Czy jest jakiś prostszy sposób na wstawianie zmiennych c++ do zapytania insert niż sprintf?

0

stringstream?

0
mad_penguin napisał(a):

stringstream?
To żeś zamienił siekierkę na kijek. Koledze chodziło o jakieś bardziej eleganckie metody tworzenia/zmiany zapytań w trakcie działania programu niż sklejanie albo operacje na stringach. Ja w pracy napisałem sobie do tego bibliotekę. Całość zorientowana jest obiektowo i operuję na tym jak na warunku dzięki czemu mogę dodawać/usuwać/zmieniać/włączać/wyłączać warunki analogicznie mogę zmieniać sortowanie po dowolnej kolumnie. Dodatkowo mam funkcje pozwalające na tworzenie customowych filtrów przez użytkownika. Po prostu wybiera sobie pola, zadaje warunki, daje OK i ma zafiltrowane dane w gridzie. Było to dawno temu, ale od tego czasu widziałem chyba 1 czy 2 SQL Buildery potrawfiące podobne rzeczy, ale nie testowałem ich, bo nie mam czasu ;)

0

Przepraszam za moją niefrasobliwość - zapomniałem napisać, że sqlite porzuciłem i "pracuję" na bazie mysql, a do komunikacji wykorzystuję libmysql. Z zapytaniami które nie wykorzystują zmiennych c++ nie ma problemu, a jak mam wstawić zmienne c++ to zaczynają się schody bo niby coś takiego:

 string query; 
char *str;
for (int i=0; i<5; i++){
   query = sprintf(znak, "\"INSERT INTO gmn (h) VALUES(%d)\"",i);
   mysql_query(conn,query.c_str());
}

się kompiluje, ale w bazie nic się nie dodaje.

gmn to tabela, która ma 2 atrybuty: id typu int autoinkrementowane oraz h typu int

0

Tak na pierwszy rzut oka jest wszystko ok. Pytanie tylko co z transakcjami? Przecież wszelkie operacje na bazie danych muszą być wykonywane w ramach jakiejś transakcji. Pytanie czy zatwierdzasz transakcję na koniec?

0

O tym nie pomyślałem, ale i tak 106 milionów wykonań pętli trwałoby za długo (mówię o docelowym programie) więc poradziłem sobie importując zawartość pliku do mysql w następujący sposób:

LOAD DATA LOCAL INFILE 'C:/xampp/htdocs/plik.txt' INTO TABLE wysokosc LINES TERMINATED BY ' '

Dziękuję wszystkim za pomoc, mam nadzieję, że najtrudniejsze już za mną ;)

0
JorgeLorenzo99 napisał(a):

O tym nie pomyślałem,
To mała rada na przyszłość. Pamiętaj o transakcjach. To ważne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1