Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

WPF i MySQL– jak to ugryźć jak nie wiem o co chodzi ?

Witam. Ostatnio biorę udział w tworzeniu dość ciekawego systemu w typowo webowej formie. Sam projekt wygląda ciekawie i na pewno przy jego tworzeniu dojdą kolejne „plusy” do doświadczenia. Jednak nie o tym tutaj ma być mowa. Wpadliśmy razem ze znajomymi na pomysł, żeby urozmaicić projekt i umożliwić prace z systemem również dla osób, które nie lubią przeglądarkowych wersji, a wola klasyczne desktopowe aplikacje. Jednak co dalej oprócz pomysłu?

Plan działania

No dobrze, pomysł jest, czas to jakoś ukształtować. Po pobieżnych oględzinach dwóch, może trzech artykułów i znajomości w wartości większej niż 1% programu Visual Studio i podpowiedzi djfoxera co do używanej wersji padło na napisanie takiej aplikacji jako WPF. Brzmi zachęcająco i obiecująca, lecz jak tego dokonać nie mając o tym pojęcia?

Jak to mówią, świat do odważnych należy, a widząc co djfoxer wyrabia tutaj na blogu ze swoja aplikacja postanowiłem nie być gorszy i nauczyć się czegoś nowego, a może za lat kilkaset cos razem napiszemy ;)

No to do dzieła. W naszym przypadku projekt oparty jest na MySQL, więc należy uprzednio pobrać Connector tego języka, by moc uzyskać połączeni z bazą danych. Dokonamy tego tutaj: http://dev.mysql.com/downloads/connector/net/ klikając na link z download ukazany na obrazku.

Instalacja przebiega bezproblemowo i nie jest skomplikowana, tak więc nie będę jej tutaj opisywał.

Co dość fajne, dla osób, które chcą poćwiczyć można pokusić się o użycie SQLite, który bardzo często wykorzystywany jest w aplikacjach mobilnych. Da się to również „podpiąć” ładnie z PHP. Wtedy bazę danych mamy w jednym pliku i możemy ją w łatwy sposób dzielić, czy zabierać ze sobą. Dość praktyczne rozwiązanie, jednak w naszym przypadku nie mieliśmy za dużo do powiedzenia, gdyż projekt z góry narzucał użycie MySQL. W przypadku użycia SQLite należy oczywiście pokusić się o instalacje connectora SQLite.

Dobra, czas działać. Uruchamiamy VS i tworzymy nowy projekt WPF.

Po jego utworzeniu widzimy nasz ”program”, my jednak przechodzimy na zakładkę XAML znajdująca się poniżej, gdzie troszkę „upiększymy” nasz interfejs dodając przycisk sprawdzający połączenie z bazą danych za pomocą kodu:

<Button Content="Mój przycisk" Width="250px" Height="50px" Name="Wykonajakcje" Click="Wykonajakcje_Click"></Button>

Oczywiście możemy dodać przycisk i inne elementy do naszego okna przesuwając je z lewego paska „Assets”. Ja jednak, jeszcze za namową alucosoftware staram się zawsze pisać kod z palca, co pozwala bardziej „wbić” mu się w pamięć.

Jak możesz zauważyć, po przejściu ponownie na zakładkę Design widać nasz przycisk , a po skompilowaniu programu (F5) jest on widoczny na naszym pulpicie, jednak przycisk, który dodaliśmy możemy naciskać w nieskończoność i nic się nie stanie.

Czas na magię

Jak zapewne zauważyłeś drogi czytelniku nasz przycisk nazywa się „Wykonajakcje”. Włączmy Solution Explorer za pomocą skrótu CTRL+; i rozwińmy ostatnią gałąź wybierając plik z rozszerzeniem .cs To w nim dzieje się cała magia i działanie naszego programu.

Dodajmy zdarzenie, które zareaguje na naciśnięcie naszego przycisku:

private void Wykonajakcje_Click(object sender, RoutedEventArgs e) { MessageBox.Show("Przycisk został użyty"); }

Na sam początek, by sprawdzić czy wszystko działa wyświetlmy sobie wyżej wpisaną wiadomość. Sprawdzamy działanie.

Jak widać nasz kawałeczek kodu działa jak należy. Idźmy więc dalej

Całość kodu odpowiedzialnego za połączenie z bazą danych proponuję umieścić w bloku try/catch, który pomoże wyłapać błędy w przysmaku, kiedy połączenie z bazą danych się nie powiedzie. Warto się przed tym zabezpieczyć, aby nie „wykrzaczyć” programu.

private void Wykonajakcje_Click(object sender, RoutedEventArgs e) { try { //Tutaj będzie kod działania programu MessageBox.Show("Przycisk został użyty"); } catch (Exception blad) { // A to obsłuży nasze błędy pokazując w oknie wiadomości błąd I informację dlaczego nie możemy się połączyć. MessageBox.Show(blad.Message); } }

Oto string zamknięty w zmiennej mojePolaczenie, który posłuży nam za połączenie z bazą danych.

Oczywiście należy zmienić poszczególne parametry jak nazwa bazy danych, hasło, nasza użytkownika i adres serwera.

Teraz zanim przystąpimy do pisania dodajmy nasz connector SQL do referencji projektu. W tym celu naciskamy w Solution Explorer na References prawym przyciskiem myszki, wybieramy Add refernce i w oknie, które nam wyskoczy wyszukujemy nawet po haśle SQL wymagana linijkę, zaznaczamy ją i klikamy OK.

Jak widać poniżej nasza referencja została dodana.

Teraz dodajemy przestrzenie naz jakich będziemy używali:

Using. System.Data;

oraz

using MySql.Data.MySqlClient;

Następnie za pomocą kawałka kodu stwórzmy w naszym evencie obiekt, czyli nasze połączenie:

MySqlConnection Polaczenie = new MySqlConnection(mojePolaczenie);

Oraz otwórzmy je linijką:

Polaczenie.Open();

Na koniec warto wyświetlić powiadomienie o tym, że połączenie zakończyło się sukcesem

MessageBox.Show("Przycisk został użyty");

Po wykonaniu operacji można zamknąć nasze połączenie.
Polaczenie.Close();

Sprawdźmy działanie. Program działa i ma się całkiem dobrze. Połączenie z naszą bazą zostaje nawiązane, co już jest sukcesem samym w sobie :)

Co dalej?

Na początku wspomniałem, ze program ma pełnić jakąś funkcję. Na początku niech w ogóle pokaże nam co jest w bazie w jakikolwiek sposób. Posłuży nam do tego kontrolka DataGrid.

Dodajmy ją w pliku XAML:

<DataGrid Name="PokazTuDane"></DataGrid>

Dodajmy zmienna przechowującą nasze zapytanie, tak by łatwiej było można je edytować, zmieniać. string ZapytanieSQL = "select * from uzytkownik;";

Następnie stwórzmy nasz Adapter do połączenia oraz w kolejnej linijce wybierzmy dla niego komendę do wykonania MySqlDataAdapter AdapterSQL = new MySqlDataAdapter(); AdapterSQL.SelectCommand = new MySqlCommand(ZapytanieSQL, Polaczenie); MySqlCommandBuilder builder = new MySqlCommandBuilder(AdapterSQL); Stwórzmy obiekt przechowujący nasze dane w formie tabeli. Ten nasz nazywa się po prostu dane.

DataTable dane = new DataTable();

Wypełnijmy nim nasz adapter

AdapterSQL.Fill(dane);

I uzupełnijmy naszą kontrolkę DataGrid o nazwieTuPokazDane naszymi danymi

PokazTuDane.ItemsSource = dane.DefaultView;

Na koniec odświeżmy nasz adapter, aby pokazać dane

AdapterSQL.Update(dane);

Skompilujmy program i zobaczmy go w działaniu

Nie martwicie się, dla testów cała baza jest chaotycznie uzupełniona, tak by sprawdzić działanie samego kodu i nie ingerować w już istniejące dane.

W przypadku złego wypełnienia danych naszej bazy ujrzymy odpowiedni błąd

Całość kodu odpowiedzialnego za działania wygląda tak:

Program działa. Jak widać designersko nie jest piękny, ale działa i to dokładnie chciałem osiągnąć. Czy w sposób właściwy? Zapewne da się to wykonać lepiej/gorzej, bardziej „właściwie”, lecz ja dopiero to „gryzę” i myślę, że to i tak wielkie osiągnięcie, które notabene wywołało uśmiech na mojej twarzy. Czy było trudno? Nie, na pewno warto!

PS: Chciałbym podziękować dla djfoxera za to, że po prostu jest, mimo tego, że troszkę daleko to jednak tak dobrych znajomych nie ma wielu, zwłaszcza pokazujących jak z niczego zrobić "coś" jak jego ostatnia aplikacja. Kolejne podziękowania dla mordzia za to, ze mnie zawsze wypycha do działania :) oraz alucosoftware za pomoc w dawnych czasach (mam nadzieję, że pamiętasz o co chodzi ;)) oraz jego charakter - człowieka, który pomaga z chęcią i robi to co lubi robić, a nie "by" robić.

Oczywiście każdy ma własne zdanie dotyczące danych kwestii nie zamierzam go w żaden sposób podważać, czy obrażać kogokolwiek w jakikolwiek sposób. Przepraszam także za ewentualne błędy.  

windows programowanie hobby

Komentarze

0 nowych
Frankfurterium   9 #1 08.05.2016 17:04

Kod po polsku? O matko bosko...

arlid   14 #2 08.05.2016 18:28

@Frankfurterium: Wiem, wiem. Nie krzycz ;p Równolegle powstaje prototyp "normalnej" wersji aplikacji. Tutaj nazwy są pozmieniane na "polskie", żeby łatwiej było ogarnąć co i skąd wychodzi. Wydawało mi się, że tak będzie bardziej przejrzyście.

Generalnie bardziej za pomocą wpisu chciałem pokazać, iż warto sięgać po coś nowego, gdyż może to przynieść jedynie pozytywne skutki :) A rozwiązanie każdego problemu to kolejne cenne doświadczenie.

ptyskju   2 #3 08.05.2016 23:23

Na Androidzie odradzali łączyć się bezpośrednio z bazą przez aplikację, strasznie ciężko było znaleźć tutoriale łączące z MySQLem. Za to proponowali używać JSONa wysyłanego ze skryptów na serwerze. I w sumie faktycznie jest to bezpieczniejsze - nie podajesz loginu i hasła do bazy w aplikacji, mniej danych przesyłanych jest do aplikacji, bo zarządza tym skrypt. Czytałem też, że baza danych ma mniej do roboty, czego nie do końca rozumiem.

pat.wasiewicz   5 #4 09.05.2016 07:28

Myślę, że fajnie by było też pokazać połązcenie EntityFramework bądź ostatnio popularnego dapper-a.
Czystego ADO.NETa już się mało wykorzystuje :)

A no i irzeczywście - polskie zmienne - bardzo zły pomysł jak na tutorial.

Autor edytował komentarz w dniu: 09.05.2016 07:29
  #5 09.05.2016 07:36

@Frankfurterium: mi też się nie podoba taki kod ale ktoś kto nie miał do czynienia z programowaniem łatwiej to ogarnie - chyba :)
Nie wiem jak teraz ale kiedyś w tych wszystkich książkach z heliona takie przykłady podawali.

mmm777   4 #6 09.05.2016 07:45

Kto tu widzi polskie litery? Najwyżej polskawe...

A w C# można jeszcze lepiej:
///
/// przewodność cieplna materiału radiatora
///
double ? = 0.0; <-- tutaj grecka litera

///
/// grubość radiatora
///
double d = 0.0;

///
/// współczynnik ustawienia radiatora
///
double ?; <-- tutaj grecka litera

///
/// współczynnik stanu powierzchni radiatora
///
double ß;
Ciekawe, że greki nie wyświetla... [?ß?] [????]

Autor edytował komentarz w dniu: 09.05.2016 09:13
  #7 09.05.2016 07:46

This topic is no longer available

kop524   4 #8 09.05.2016 08:40

W itam a jak to zrobić w SQLServer ???

  #9 09.05.2016 08:59

jakaś ściema w wpf nie działa mbox bo to jest część windows forms chyba, że dodaliście formsy do wpf ale to by przeczyło wpf bo po co ?

WODZU   16 #10 09.05.2016 09:27

@arlid: Wpis fajny, ale chyba Alt szwankuje Ci w klawiaturze ;)

Autor edytował komentarz w dniu: 09.05.2016 09:28
mordzio   14 #11 09.05.2016 09:37

Zapowiada się ciekawy cykl. Powodzenia!

rmind   5 #12 09.05.2016 09:53

@Frankfurterium: Nic nie mów, też tak kiedyś pisałem. I miałem po temu dobry powód: od razu odróżniałem co jest moim wymysłem, a co pochodzi z bibliotek czy innych źródeł. Dopiero przestawiłem się na wszystko po angielsku (i teraz tak już tylko piszę wszystkie projekty), kiedy okazało się, że potencjalnie lub faktycznie będę / jestem / byłem zmuszony do pracy w wielonarodowym środowisku.

Zresztą pisanie kodu w innych językach niż angielski jest dość powszechne - pamiętam np. tragiczne projekty z niemiecko-języcznego obszaru, gdzie nie tylko kod, ale nawet taski przydzielano mi po niemiecku. Oczywiście musiałem tłumaczyć to wszystko przez google translatora, bo nie znam języka :P

slepcu   6 #13 09.05.2016 10:02

@arlid, @ptyskju :Jeżeli macie w planach rozwój zarówno projektu webowego i desktopowego to radzę raczej nie umieszczać obsługi bazy danych w aplikacji desktopowej.
Z kilku przyczyn:
1. Dane do połączenia - robiąc to w ten sposób każdy może sobie zdekompilować apkę i wyciągnąć dane dostępowe do bazy;
2. Możliwość połączenia do bazy - wasz serwer SQL może być po prostu nie dostępny dla szerszego grona (co więcej powinniście do tego dążyć);
3. Serwery SQL mają ograniczoną ilość połączeń;
4. Nie potrzebnie będzie mieli zdublowaną logikę - ten sam kod będzie w dwóch miejscach co powoduje podwójną robotę w razie poprawek, łatwo o dodatkowe błędy;
5. Duplikacja zapytań - wiele takich samych zapytań będzie robionych przez każdego klienta - aż prosi się o cachowanie wyników;

Dlatego polecam przejście na serwerowe api i łączenie się z nim w aplikacji desktopowej.

Autor edytował komentarz w dniu: 09.05.2016 10:08
__Tux__   12 #14 09.05.2016 10:09

@arlid: Najlepiej od początku pisać kod jak najlepiej nawet, jeśli to apka testowa. To właśnie na apce testowej można poćwiczyć sobie dobre nawyki, bo w produkcji nie ma na to miejsca. Pisanie kodu po polsku ma jeden minus: zrozumiesz go Ty, ale nie ludzie na stackoverflow :-) .

Autor edytował komentarz w dniu: 09.05.2016 10:09
mr-owl   5 #15 09.05.2016 11:13

@kop524: A co konkretnie potrzebujesz?

angh   8 #16 09.05.2016 11:29

Bardzo fajnie, ze taki artykul sie tutaj pojawia, ale juz pomijajac uzywanie polskiego, co moze i jakos by przeszlo zakladajac ze nikt nie ma ambicji kiedykolwiek wyskoczyc poza granice kraju (zwykle konczy sie na problemach, kiedy nagle sie okazuje, ze trzeba), to sam kod powoduje u mnie dreszcze...

Wykonajakcje
Wykonajakcje_Click
string ZapytanieSQL
string mojePolaczenie
new MySqlCommand(ZapytanieSQL, Polaczenie)

Jezeli decydujesz sie na jakas notacje, badz konsekwentny (a Wykonajakcje zamiast WykonajAkcje podnosi mi cisnienie;) ). Pierwszy raz widze zwykly string zapisywany duza litera, obiekty zzpisywane mala, brak camel case gdzie potrzebny, a potem underscore.
Ten kod padl by u mnie od razu na zwyklym lint, jest to cos, co nigdy nie powinno byc pokazywane jako przyklad dla poczatkujacych.
Polecam tez notacje wegierska. Znacznie ulatwia 'maintenance' wiekszych projektow, szczegolnie w grupie.

Wracajac do polskiego:
PokazTuDane.ItemsSource = dane.DefaultView;

jezeli to nei pokazuje slabosci tego podejscia, to nic nie pokaze;)

Autor edytował komentarz w dniu: 09.05.2016 11:30
djfoxer   17 #17 09.05.2016 12:45

Fajnie, że zacząłeś serię wpisów z WPF i SQL, ale... (zawsze jest jakieś ale :P ):
- tworzenie tego typu "gołych" zapytań jest niedopuszczalne i błędnogenne, warto przejrzeć EntityFramework lub nHibernate
- używanie polskich zmiennych nie jest przestępstwem, ale takie połączenie "blad.Message" jest na pewno mniej czytelne niż np. "excepton.Message"
- WPF fajnie łączy się z MVVM i na pewno w warto promować ten sposób tworzenia apek (miło się pisze z MVVM Light)

  #18 09.05.2016 13:15

@ptyskju: Jeżeli chodzi o mniejszą ilość pracy to zapewne baza danych w przypadku użycia pośredniczącego serwera obsługuje mniejszą ilość połączeń (1 połączenie zamiast tylu, ilu jest aktywnych użytkowników).

  #19 09.05.2016 16:24

@djfoxer EntityFramework tez potrafi zepsuc krew i do malych projektow stosowanie jest bez sensu (sam unikam ja moge) i wolne, zas do duzych lepiej nhibernate - jest dojrzalsze a nauka sie przyda w razie przejscia na java.
W ogole nie rozumiem dlaczego autor łączy we wpisie MySQL i WPF - te dwie rzeczy są zupelnie niepowiazane i WPF powinno tylko dowiedziec sie o danych a skad sie biora-to zadanie dla innych warstw.

WPF w ogole nie warto promowac, bo to twor na jedna platforme.
Poza tym autor robi krzywde klientowi, bo w nowym projekcie stosuje technologie, ktore MS juz porzucil i nie rozwija.
Ogolnie wspolczuje wykorzystania DataAdapter i otoczki - jest popieprzona

@slepcu: "y może sobie zdekompilować apkę i wyciągnąć dane dostępowe do bazy; " Oszalales? Ma trzymac dane dostepowe w exe???
Przeciez mozna zaszyfrowac sekcje connectionString w config kluczem maszyny, zaszyfrowac kluczem maszyny i zapisac do rejestru, wymusic stosowanie odbc w systemowym DSN, zastosowac logowanie domenowe (ale to mssql).

2,3,4,5 - zgadzam sie.
Do tego nalezy dodac, czy MySQL przy takim wykorzystaniu nie musi miec wykupionej licencji bo cuda sie zdazaja.

Ja bym nie szedl w WPF, lepiej przyszlosciowo w Mono + gtksharp - byloby przenosne na linuksa :-D

aphazel   8 #20 09.05.2016 17:13

@ecccchhtk (niezalogowany): "jest dojrzalsze" to za przeproszeniem, argument z d... Ten z przejściem na Javę ma już sens. EF kiedyś do pięt nie dorastał NH, ale teraz wg mnie jest miejscami dużo lepszy. W każdym razie i jeden i drugi framework ma swoje wady i zalety. Który lepszy - zależy od potrzeb projektu. Używam EF do małych projektów i bangla świetnie, z NH już bym się na to nie zdecydował. Z ADO.NET na goło i wesoło też kiedyś korzystałem, obecnie tylko jeden stary produkt muszę utrzymywać. Jeśli chce się trzasnąć apkę na 1 raz to można bardzo szybko. Ale utrzymywanie wersji przez lata, z bugfixami, enhancementami, to już męczarnia bez porządnego ORM.

  #21 09.05.2016 17:52

@aphazel: ecccchhtk

"g mnie jest miejscami dużo lepszy. " miejscami, a popatrz na calosc.
Oczywiscie, ze NH jest dojrzalszy, ten projekt ma swoje lata, istnial, gdy MS dopiero sie uczyl pisac swoj ORM. Wiecej - NHibernate sprawdzil sie w duzych systemach a nie tylko popierdułkach kadry-płace.

tutaj masz ciekawy artykul http://enterprisecraftsmanship.com/2014/11/29/entity-framework-6-7-vs-nhibernate.../

dzieki ktoremu zrozumiesz co mialem na mysli (nie patrz na rok, dalej obowiazuje EF6)

tutaj masz jeszcze ciekawy komentarz Ricardo Peres'a
https://www.devbridge.com/articles/entity-framework-6-vs-nhibernate-4/

slepcu   6 #22 09.05.2016 18:39

@ecccchhtk (niezalogowany): co do connection stringa, w fragmencie kodu przedstawionym w tym artykule przecież jest tworzony connection string w kodzie i przekazywany bez pośrednio; zgadzam się z Tobą że to zły pomysł, ale nie rozumiem czemu masz pretensje do mnie : jak już ktoś chce trzymać dane dostępowe na sztywno w kodzie to niech chociaż taka skompilowana aplikacja nie idzie do klienta tylko siedzi na serwerze.

arlid   14 #23 09.05.2016 19:43

@WODZU Tak, mam z tym problem, ale nie wiem co jest powodem. Czasem jak załapie "buga" to strach. Staram się to rozwiązać jakoś :)
@mordzio Nie zapeszaj, ale plan jakiś jest.
@djfoxer Dzięki za komentarz. Każda rada jest cenna :) Co do polskich nazw to w zupełności się zgadzam, ze nie wygląda to najlepiej.
@slepcu Poczytam i wezmę do siebie to co napisałeś. Sensownie i klarownie

Każda krytyka jest dobra, wiem na co zwrócić uwagę i w jakim kierunku iść dalej. Nie jestem do końca pewien, czy powstanie wersja desktopowa. Na chwilę obecną zajmujemy się czystą wersja PHP. Tam się bardziej "odnajduję", chociaż z chęcią przyswajam coś nowego.

  #24 09.05.2016 19:58

@arlid: jak chcesz dobre wzorce i dowiedziec sie cos innego, bardzo polecam pozycje ISBN 83-7361-715-9. Nie sugeruj sie tytulem, jest troche nieszczesliwy.
No i swietne i niedrogie sa szkolenia na pluralsight.

  #25 10.05.2016 01:30

Co tu sie dzieje? O_o

aphazel   8 #26 10.05.2016 14:32

@ecccchhtk (niezalogowany): po pierwsze nie mam zamiaru cię przekonywać na siłę. Jeśli uważasz, że NH jest lepsze, to OK. Ja wcale nie przeczę, że NH ma swoje lata, ale dla mnie to żaden argument. Wiek nie jest argumentem na plus. Tylko jakość i możliwości. Jeśli stary projekt rozwija się w tempie 30, a młody w tempie 70 (abstrakcyjna jednostka) przy założeniu takiego samego podejścia do jakości, to ten dojrzały zostanie daleko w tyle.

Co do linków:
1. Przez większość artykułu opisane są typowe problemy dla juniora, dopiero w podusmowaniu przechodzi do rzeczy, pod kątęm których warto zacząć się zastanawiać, co wybrać.
2. Dzięki za ten link. Art. Dariusa Kučinskasa w dużej mierze pokazuje, dlaczego ja wybieram EF w 9 na 10 przypadków: schema migrations (de facto to już było w EF5, ale w 6 jest mocno ulepszone), async operations, connection resilency. Jedyną przewagą NH, jaką widzę, jest wbudowany 2nd level cache, ale dla EF sam sobie napisałem i problemie. Co z tego, że w NH mogę napisać pierdylion generatorów ID, czy strategii kontroli współbieżności (Ricardo Peres), skoro i tak będę używał JEDNEGO generatora i JEDNEJ strategii, a wsparcia migrowania bazy brak, asynchronicznych operacji brak, itd.

Jeszcze raz, jeśli wybierasz NH, nie EF, to dla mnie OK. Każdy ma to, co lubi.

aphazel   8 #27 10.05.2016 14:38

@arlid: Popularnym i klasycznym już podejściem, kiedy nie jesteś pewien co do ilości klientów (aplikacji) do zaimplementowania jest zrobienie RESTful API (lub analogicznego) do "gadania" frontendu z backendem, gdzie wersja webowa też z tego API korzysta. Wtedy możesz w dowolnym momencie późniejszym zdecydować, czy chcesz budować klienta na desktop, apkę na iOS, czy coś innego.

  #28 10.05.2016 20:09

@ptyskju: Mniejsza ilość jednoczesnych połączeń do obsłużenia ...

JSON stanowi proxy i jego konfiguracja pilnuje limitów ....

kwpolska   5 #29 13.05.2016 17:36

@arlid: prawdziwy programista nigdy nie pisze kodu po polsku. Nigdy.