Komponent do obsługi MySQL

0

Jaki komponent polecacie do obsługi MySQL-a do zastosowań komercyjnych.

pÓÓÓÓki co wiem że sprawdzony to:

  1. AnyDac - ok 1200zł
  2. MyDac - ok 400zł - plus jest taki że nie potrzeba żadnej dodatkowej biblioteki dll typu libmysql.dll

Czy jest coś jeszcze warte uwagi?

0

teoretycznie ZeosLib, ale on potrzebuje dll.

Osobiscie nie testowalem szeroko polecanego AnyDAC, ale 1200 zl wydaje sie troche duzo.

0

W zależności od wersji Delphi, na pokładzie powinieneś mieć komponent do MySQLa (TSQLConnection). Aczkolwiek pamiętam był on dość problematyczny (korzysta z dll MySQL).
Generalnie używam MyDACa i mogę go polecić.

0

Też się skłaniam w kierunku MyDAC.

maciejmt Czy ty używasz tego komponentu z wykożystaniem pliku libmysql.dll czy bez niego. Jakie są zalety stosowania tego pliku a jakie wady?

0

Jak masz MyDACa to nie potrzeba żadnych bibliotek.
A jak użyjesz komponentu to trzeba dystrybuować ten DLL z aplikacją.
Kiedyś testowałem wydajność i chyba była dość porównywalna (ale szczegółów już nie pamiętam).
Na pewno MyDAC jest wygodny - wrzucasz jeden komponent i po prostu działa. Jest też kilka innych przydatnych komponentów np TMyScript.

Generalnie zakup w firmie tego komponentu nie był problemem. Ale jak nie chcesz ponosić kosztów to użyj to co jest wbudowane (a zamiast tego np zainwestować w pakiet TMS component, który również chwalę).

0

Możesz również zastanowić się nad zakupem UniDAC, także firmy Devart (producenta MyDAC). UniDAC umożliwia łączenie się także do innych systemów baz danych np. SQL Server, Oracle, SQLite itd.

0

UniDAC - wymagany plik dll do obsługi. Postanowiłem wybrać MyDac. Tylko czy waszym zdaniem warto dopłacić i wybrać wersję professional?

Link do opisów: http://www.devart.com/mydac/editions.html

0

UniDAC moze pracować w trybie Direct, wówczas nie potrzebuje żadnej dll-ki lub może wskazać zewnętrzną bibliotekę. Zresztą jaki problem, żebyś pobrał i zainstalował wesję Trial.

0

okej, a co polecacie UniDAC czy AnyDAC?

uzywam zeosa, ale z plikiem dll do mysql, a tutaj juz licencja sie klania komercyjna.
generalnie uzywam mysql,
ale chcialbym cos co takze obsluzy ms sql, postgress oraz firebirda jakby co.
Szkoda bo nie mam takich rzeczy jak ado, czy odbc w swojej wersji delphi.

0

Nie znam AnyDACa, wykorzystuję głównie MyDAC (od około 6-7 lat) oraz okazjonalnie UniDAC (gdy muszę przygotować oprogramowanie do importu danych z innych systemów).
W pracy są (MyDAC i UniDAC) dosyć wygodnie (np. generator kodu sql dla zapytań modyfikujących dane), a zastosowanie parametrów i makr, to po prostu mistrzostwo świata (chociaż pewne w AnyDACu też to funkcjonuje). Z pewspektywy tych kilku lat użytkowania mogę stwierdzić, że cały czas ię rozwijają - ostatno dodali możliwość szyfrowania zawartości pól tekstowych po stronie klienta. Raczej nie ma problemu z uzyskaniem pomocy technicznej, a stwierdzone bugi starają się usuwać w miarę szybko (zwykle w ciągu miesiąca przy następnej aktualizacji).
Tak jak napisałem wcześniej, najlepiej pobierz wersje testowe i się nimi pobaw, wówczas sam będziesz mógł zdecydować, które rozwiązanie jest dla ciebie lepsze.

0

ps. jeżeli będziesz się decydował na UniDACa, to zastanów się nad wersją - dopiero wersja professional posiada możliwość łączenia się ze wszystkimi wymienionymi systemami baz danych, wersja standard ma tę opcję mocno okrojoną:
http://www.devart.com/unidac/editions.html

0

MiM Twoje informacje są naprawdę cenne. Postanowiłem wybrać MyDac w wersji Pro. Ciekawe rozwiązanie z tym zdarzeniem onConnectLost. Skorzystam i zadam ci jedno pytanie tutaj gdyż nie chcę specjalnie zakładać nowego posta.

Są sytuacje że trzeba wykonać kilka zapytań np

SQL.Text := 'odejmij 1 z tabeli A';
Execute;
(...) Wykonaj jakieś czynności i dopiero potem
SQL.Text := 'dodaj 1 w tabeli B';
Execute;

Jak się zabezpieczyć jak pomiędzy zapytaniami stracimy połączenie na chwilę lub na dłuższy czas np (dostawca internetu nawalił).
Ja myślę o generowaniu raportów i w razie czego do każdego zapytania tworzy tzw "cofnij zmiany" i po ponownym np uruchomieniu programu wykonuje te cofnięcia aby ilości się zgadzały w bazie.

0

Możesz skorzystać z transakcji (dotyczy tabel InnoDB). Czyli, dopóki jej nie zakończysz poleceniemm commit, zmiany nie są widoczne. Gdy się ponownie połączysz po utracie połączenia, można wycofać transakcję (rollback).
Ponadto warto w takiej sytuacji skorzystać z komponentu TMyScript, albo o ile masz taką możliwość zdefiniować procedury w bazie danych (wówczas procedura jest wykonywana po podaniu wszystkich niezbędnych parametrów i jej uruchomieniu).

0

a jak lepiej pilnowac 'danych', stosowac transakcje, a moze trigery i procedury?

0

Raczej trudno jest rozpatrywać, że transakcje są zastępnikami wyzwalaczy i procedur. Ich zastosowanie zależy od konkretnego problemu. Nikt nie zabrania wykorzystania wszystkich tych rozwiązań. Wg mnie problem poruszony przez @Rafał D aż się prosił o skorzstanie z mechanizmów transakcji. Uwzględniając, że często uprawnienia w zakresie tworzenia własnych procedur i wyzwalaczy na internetowych serwerach MySQL są ograniczone (np. w nazwa.pl) wychodzi na to, że najłatwiejszym sposobem rozwiązania zatwierdzania wielu zapytań jest mechanizm transakcji. Natomiast, jeżeli posiadałby uprawnienia do generowania własnych procedur i triggerów w bazie danych, to opisany problem mozna by było rozwiązać za ich pomocą - wówczas nie musi tworzyć tabel InnoDB, a skorzystać z "szybszych" MyISAM (przede wszystkim uniezależniając się od wersji serwera MySQL - InnoDB Storage Engine dostępne jest bodajże od wersji 5 serwera).

0

MiM Mam do Ciebie jeszcze jedno pytanie czy mogę w sposób podany poniżej operować na 2 tabelach jednocześnie?

MyData1 := TMyQuery.Create(nil)
MyData2 := TMyQuery.Create(nil)
MyData1.Connection := MyConnection;  
MyData2.Connection := MyConnection;

MyData1.SQL.Text := 'SELECT * FROM Tabela1';
MyData2.SQL.Text := 'SELECT * FROM Tabela2';

Liczba := MyData1.FieldByName('a').AsInteger + MyData2.FieldByName('b').AsInteger;

Czy raczej muszę używać "Master/Detail Relationships" z TDataSource; (tak jak w helpie)

0

Można operować na kliku tabelach jednocześnie w sposób PRAWIE taki, jak przedstawiłeś. PRAWIE wynika z tego, że przedstawiony przez Ciebe kod zawiera błedy oraz nie realizuje tego, co sobie prawdopodobnie założyłeś (podejrzewam, że chodzi Ci o przeliczanie wartości w tabelach nadrzędnej i podrzędnej):

  • żeby skorzystać z wartości pól 'a' i 'b' w MyData1 i MyData2 musisz wykonać te zapytania poprzez polecenie MyData1.Open i MyData2.Open (przed podstawieniem wartości tych pól do zmienej Liczba);
  • z kodu nie wynika jakakolwiek relacja pomiędzy tabelami ujętymi w zapytaniach, a wnioskuję, że chodzi Ci o przetwarzanie wartości ujętych w tabelach nadrzędnej i podrzędnej. Wykonując swój kod (Jeżeli uwzględnisz uwagę ujętą w pkt. 1) wyliczysz tylko sumę wartości pól 'a' i 'b' w pierwszych rekordach tabel 'tabela1' i 'tabela2';
  • warto by było również na zakończenie kodu zwolnić pamięć przydzieloną obiektom MyData1 i MyData2 (wykonując MyData1.Free i MyData2.Free).
0

MiM

Ad3. Tak oczywiście że muszę zwolnić tworzone obiekty tego tu akurat nie objąłem, zawsze wrzucam to do finallly.
Ad1. Zapomniałem umieścić w kodzie po przypisaniu zapytania - jego wykonania. Ja stosuję

MyData.Active := True; //Jesli odczytuje wiecej niż jeden rekord;
MyData.ExecSQL; //Jesli wstawiam coś do tabeli lub modyfikuje

Natomiast jaka jest zasadnicza różnica miedzy MyData.Active := True a MyData.Open ?

0

jedno zwraca wynik drugie nie, jedno stosujesz dla zapytania np. Select a drugie np. do DELETE.

0

Różnica jest jak najbardziej istotna: MyData.Active jest parametrem i określa stan obiektu MyData, natomiast MyData.Open jest metodą, po wykonaniu której można sprawdzić stan połączenia "if MyData.Active then...".
Aby otworzyć zapytanie z "select" można stosować zamieni MyData.Open lub MyData.Active := true. Czytelniejsze dla mnie jest użycie open.
Wg mojej wiedzy, ani MyData.Active, ani MyData.Open nie używa się do zapytań modyfikujących dane - służy do tego ExecSQL (w przypadku klasy TMyQuery) lub Execute (TMyCommand).

0

nie wiem jak w MyDac lub UniDac, ale w Zeos'ie Open = Active:=True

0

A takie głupie pytanie. Od kiedy AnyDAC jest płatny?

0

FreeDAC jest od dawna 'zamrozony', ale co dziwne zamrozili takze sprzedaz AnyDAC i nie mozna go nabyć...

0

MiM Czy jest jakaś gotowa funkcja w MyDAC aby sprawdzić czy tabela, kolumny istnieją? (Czy tylko po przez zapytanie SQL można to zrobić)

Do czego służy komponent TMyScript? Co to są Makra i do czego się przydają?

0

Wiecie co właśnie dostałem od BSC Polska w biuletynie?

Szanowni Państwo,

Zapraszamy do zapoznania się z biuletynem informacyjnym BSC Polska.

FireDAC - technologia do wydajnego łączenia się z bazami danych

Pełna integracja z Delphi, C++Builder i RAD Studio

FireDAC jest wydajną i łatwą w użyciu biblioteką komponentów ułatwiających tworzenie połączeń z bazami danych w aplikacjach działających na urządzeniach korzystających z różnych systemów operacyjnych: Windows, Mac oraz platform mobilnych. Wprowadzenie biblioteki FireDAC jest wynikiem przejęcia przez Embarcadero technologii AnyDAC od firmy DASoft.

Komponenty FireDAC mogą być bezpłatne pobrane przez nabywców narzędzi RAD Studio, Delphi lub C++Builder XE3 w wersjach Enterprise, Ultimate i Architect. Użytkownicy wersji Professional mogą nabyć je po promocyjnych cenach.

http://www.embarcadero.com.pl/edm/b1303/dasoft.shtml
http://www.embarcadero.com.pl/edm/b1303/firedac_info.shtml
http://www.embarcadero.com.pl/edm/b1303/firedac.shtml

0

TMyScript służy do wykonywania sekwencji poleceń SQL np. modyfkujących dane lub strukturę.

Nie ma bezpośrednio dostępnego polecenia sprawdzającego, czy tabela istnieje, można użyć polecenia show tables (pokazuje tabele w bieżącej bazie danych), sprawdzić zapisy w tabeli TABLES w INFORMATION_SCHEMA lub z poziomu delphi MyConnection.GetTableNames

Macra pozwalają sparametryzować zapytanie, np. jeżeli tabela posiada pola A,B,C,D oraz mamy zapytanie select A,B,&TwojeMakro as Wartosc from Tabela
i podstawiając przed wykonaniemzapytania MyQuery.MacroByName('TwojeMakro').Value := 'D' w zapytania wyniku otrzymamy wartości z pola D jako Wartosc. Można oczywiście w macrach wstawiać bardziej złożone formuły.

0
maciejmt napisał(a):

(a zamiast tego np zainwestować w pakiet TMS component, który również chwalę).

Ciekawe, ale jesteś jedną z nielicznych osób którzy chwalą te mega-zabugowane komponenty.
Oczywiście to zależy jeszcze które, ale taki np. TMSDBGrid - masakra...

0
Paweł Dmitruk napisał(a):

nie wiem jak w MyDac lub UniDac, ale w Zeos'ie Open = Active:=True

Skoro nie wiesz, to polecam prześledzenie kodu klasy TDataSet (tak, tak - wszystkie DACi w Delphi dziedziczą z TDataSet) i wszystko stanie się jasne ;)

0
MiM napisał(a):

TMyScript służy do wykonywania sekwencji poleceń SQL np. modyfkujących dane lub strukturę.

Nie ma bezpośrednio dostępnego polecenia sprawdzającego, czy tabela istnieje, można użyć polecenia show tables (pokazuje tabele w bieżącej bazie danych), sprawdzić zapisy w tabeli TABLES w INFORMATION_SCHEMA lub z poziomu delphi MyConnection.GetTableNames

A w AnyDAC jest cały posystem operaowania na metadanych i dość potężny.
O tyle fajny, że zamyka wszystko w jednej obiektowej strukturze i działa ze wszystkimi bazami danych wspieranymi przez AnyDAC (FireDAC).
http://www.da-soft.com/anydac/docu/frames.html?frmname=topic&frmfile=idx.html

Macra pozwalają sparametryzować zapytanie, np. jeżeli tabela posiada pola A,B,C,D oraz mamy zapytanie select A,B,&TwojeMakro as Wartosc from Tabela
i podstawiając przed wykonaniemzapytania MyQuery.MacroByName('TwojeMakro').Value := 'D' w zapytania wyniku otrzymamy wartości z pola D jako Wartosc. Można oczywiście w macrach wstawiać bardziej złożone formuły.

Napisałeś formuły; czy mam rozumieć że w MyDAC wbudowany jest preprocesor SQL'a, który pzowala na takie cuda jak np.:
http://www.da-soft.com/anydac/docu/frames.html?frmname=topic&frmfile=idx.html

Oczywiście można rejestrować własne funkcje w tym mechanizmie (np. do pobierania numeru dokumentu), albo wykorzystać go w sposób dość... zaskakujący jak np. filtrowanie za pomocą składni WHERE SQL'a list obiektów w listach generycznych (TList<TMyClass>) - no, ale tu nie podrzucę linka, bo do mojego dysku nie zadziała ;-)

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