WPF i MySQL– jak to ugryźć jak nie wiem o co chodzi ?
08.05.2016 | aktual.: 09.05.2016 06:24
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.