C# Program z wykorzystaniem bazy danych

Hej,

chciałbym was prosić o jeszcze jedną pomoc - chodzi o stworzenie programu z wykorzystaniem bazy danych zarówno offline oraz online.

Chciałbym w Visual Studio C# zrobić program, który będzie przechowywał informacje w bazie danych - będą dwie tabele pracownicy i zlecenia.

Będzie kilka aplikacji klienckich, które będą łączyły się z bazą danych online i z nich pobierały “świeże” informacje - programy te także mogą modyfikować bazę danych.

W przypadku braku połączenia z bazą danych, chciałbym aby programy te pracowały offline na bazie danych, którą wcześniej importowały online (gdy był dostęp do internetu).

A więc program ma mieć możliwość łączenia z bazą danych MYSQL online, a także przechowywać tą bazę offline - chciałbym zapytać jak takie coś zrobić ?

Posiadam serwer MYSQL z którym można łączyć się zewnętrznie (nie trzeba wykorzystywać wyłącznie localhost) - i chciałbym stworzyć w nim te dwie tabele, czy muszę to robić ręcznie za pomocą zapytań SQL i wydawać taką komendę w programie ? Będzie ona przecież trochę długa …

Rozumiem, że można to zrobić w PHPMyAdmin bezpośrednio na stronie - ale w przypadku gdy użytkownik, będzie chciał zmienić bazę danych na inną, gdzie nie ma tej struktury bazy danych - to wolę takie coś zaimplementować w programie - aby automatycznie tworzył bazę danych - jak to zrobić ?

Druga sprawa - w jaki sposób przechowywać bazę danych offline, pracować na niej i aktualizować te zmiany w przypadku gdy będzie połączenie z internetem ?

Posiadam program Power Designer i w nim mogę utworzyć tabele i relacje pomiędzy nimi - ale jak wygenerować z tego bazę danych i używać jej w programie ?

Podkreślam, że chciałbym online pracować na bazie danych mysql (gdyż taki mam darmowy serwer z dostępem zewnętrznym).

Dzięki za pomoc :slight_smile:

  1. Nie jest to łatwa sprawa, bo dane mogą się łatwo rozjechać (szczególnie w sytuacji, gdy jest możliwa modyfikacja poszczególnych rekordów przez różne programy-klienty). Być może rozwiązaniem okaże się jedna z technologii umożliwiających synchronizację danych http://msdn.microsoft.com/en-us/sync/cc470041. Sęk w tym, że nie wiem, czy MySQL jest wspierany przez jakąkolwiek z tych technologii (musisz sam to sprawdzić). Poza tym musisz wybrać coś co posłuży za lokalne źródło danych (gdzieś przecież musisz te dane offline zapisywać). Instalowanie na każdym komputerze bazy MySQL to raczej zły pomysł. Za lokalne źródło danych mogłaby Ci posłużyć baza SQL Server Compact.

  2. Co to znaczy, że użytkownik może sobie zmienić bazę danych? Użytkownika nie powinno interesować, gdzie dane są przechowywane. Chcesz użytkownikowi dać możliwość wyboru bazy danych? To ile będziesz mieć tych serwerów i po co tyle?

Bazę danych (tabele, relacje między nimi, procedury itp.) generujesz za pomocą phpMyAdmin (phpMyAdmin to program do zarządzania bazą danych, tak jak np. SQL Server Management Studio) i później z programów-klientów tylko się z nią łączysz w celu pobierania/modyfikacji/wstawiania danych do poszczególnych tabel.

A jak zrobić, aby posłużyć się jednym dataadapterem do odczytywania tabeli z bazy danych - czy mogę jednocześnie odczytać wszystkie (załóżmy że mam dwie tabele pracownicy i zlecenia) :

Teraz informacje z tabeli pracownicy wyciągam w ten sposób :

string pytanie1 = "select * from pracownik";

                polaczenie.Open();

                MySqlDataAdapter adapter = new MySqlDataAdapter(pytanie1,polaczenie);

                DataSet zapamietaj = new DataSet();

                adapter.Fill(zapamietaj,"pracownik");


                int liczba_kolumn = zapamietaj.Tables[0].Columns.Count;

                label1.Content = "";

                for (int i = 0; i < liczba_kolumn; i++) { 


                    label1.Content += (zapamietaj.Tables[0].Rows[0][i].ToString())+" ";


                }

Czy muszę tworzyć nowy obiekt adaptera z nowym zapytaniem ? Jak wyciągnąć dane zarówno z tabeli pracownicy i zlecenia i je wyświetlić ?

PS : zmienna polaczenie to MySqlConnection polaczenie = new MySqlConnection(lokalizacja);

( gdzie lokalizacja to dane serwera mysql - potrzebne do inicjalizacji polaczenia).

  1. Każda tabela powinna mieć swój DataTableAdapter, czyli innymi słowy, jednego adaptera nie powinieneś używać do pobierania danych z dwóch tabel. Ogólnie to DataSet (i związane z nim obiekty DataTable, DataRelation, DataTableAdapter, itd.) możesz wygenerować. Nie musisz wszystkiego pisać ręcznie. Wybierz z menu Visual Studio: Data -> Show Data Sources -> w okienku, które się pojawi kliknij PPM i wybierz Add New Data Source … -> Otworzy się kreator -> Wybierz Database -> Wybierz DataSet -> I dalej czytaj co pisze na ekranie :slight_smile:

  2. Wyświetlać dane z DataSet-a możesz albo do kontrolki DataGridView albo do zwykłych kontrolek. Jak się to robi było już omawiane w ostatnim temacie (miałeś podany link). Dla przypomnienia … otwierasz sobie znowu okienko Data Sources i przeciągasz na formę np. tabelę Address. W efekcie uzyskasz to co widać na załączonym poniżej rysunku.

Jeśli dane chcesz wyświetlać w zwykłych kontrolkach to musisz wykonać następującą zmianę

Wybierz z menu Visual Studio: Data -> Show Data Sources -> w okienku, które się pojawi kliknij PPM i wybierz Add New Data Source ... -> Otworzy się kreator -> Wybierz Database -> Wybierz DataSet -> I dalej czytaj co pisze na ekranie

To akurat rozumiem - tylko jak to zrobić z bazą danych online tzn. mysql. Zainstalowałem sobie mysql connector, ale przy wyborze data source (w miejscu gdzie napisałeś … czytaj co pisze na ekranie) nie mam wyboru mysql database - mam tam tylko Microsoft Access, Sql Server compact 3.5, Sql Server Database.

W tym drugim mogę utworzyć własną bazę danych jest opcja create - w pozostałych muszę już mieć gdzieś gotową.

To czy baza danych jest zdalna, czy nie, nie ma w tym wypadku żadnego znaczenia.

A skąd tam masz mysql database instalowałeś coś dodatkowego ? Czy może to być winą, że mam wersję Visual Studio C# Express 2010 a nie pełną wersję ?

Czy jest możliwość dodania tego mysql database (instalowałem connectora mysql ale nic to nie dało).

Instalowałem tylko i wyłącznie Connector/Net 6.4.4. Być może jest to wina wersji VS (ja to instalowałem na wersji Ultimate). Spróbuj przeinstalować Connector.

Chyba to jednak wina wersji VS - zaopatrzę się zatem w VS Ultimate :slight_smile:

Jesteś studentem czy planujesz większe zakupy?

Pytanie zasadnicze - po co używać jakichś śmieciowych DataSetów, zamiast użyć normalnych klas i ORMa?

@compiler

To jest cholernie drogie środowisko. Sprawdziłem, czy to na pewno jest wina VS Express i faktycznie tak jest:

http://dev.mysql.com/doc/refman/5.1/en/connector-net.html

@somekind

Jeśli będzie chciał skorzystać z ADO .NET Entity, to również potrzebuje tego Connector-a.

Przecież jako DataSource można wybrać DOWOLNĄ klasę. Nie ma znaczenia do jakiej bazy danych ją się później zmapuje.

Jestem studentem więc dla mnie to żaden problem :wink:

Mam tylko jedno pytanie ustawiłem połączenie z bazą danych i gdy dochodzę do dataset a dokładnie “Choose your database objects” i wybieram tam wszystko tzn. tables,views … (albo tylko tabele) to mi się w tym momencie wiesza strasznie długo.

A na końcu pisze Failed to open a connection to the database - a przecież wpisałem poprawne dane przy testowaniu na poczatku bylo successed.

Co jest grane ?

@somekind

Jeśli uzyska połączenie z bazą danych od razu, to będzie mógł sobie wszystkie encje wygenerować automatycznie. Nie będzie nic trzeba pisać ręcznie.

@compiler

Ciężko powiedzieć, być może Timeout? Możesz spróbować z jakimś innym hostingiem (a najlepiej z lokalną bazą danych)?

Faktycznie problemy są z bazą danych db4free… bo na lokalnej działa.

Tylko zastanawiam się w takim razie - jeżeli zrobię to na lokalnej bazie danych i układ tabel będzie taki sam za pomocą dataset, który generowany jest automatycznie (tak jak to pokazałeś na obrazku z 4 postu), to czy będzie to działało w przypadku zmiany bazy danych tzn. lokalizacji na bazę zewnetrzną ?

Załóżmy że zrobię połączenie z programem w ten sposób, poukładam sobie kontrolki dataset w oknie programu (przeciągnij -> upuść z datasource tabele dataset1) i jak zmienić teraz ścieżkę że zamiast localhost będzie to np. db4free.net ?

Nigdzie tam nie widzę takiej opcji w kodzie programu, aby skądś to czytał …

I czy jak zmienię źródło bazy danych to czy ten stary dataset zostanie, czy on też zniknie ?

Jak zrobić w takim razie możliwość wprowadzenia lokalizacji bazy danych mysql (nazwa serwera, nazwa usera, haslo, nazwa bazy danych) ??

PS: A znacie może jakieś darmowe bazy danych mysql z możliwością połączenia z zewnątrz - bo z tym db4free się łączy, ale już dataset nie potrafi utworzyć (nawet jak zwiększe czas połączenia - to mi się VS wiesza, a na końcu i tak błąd połączenia :stuck_out_tongue: )…

Ale o dziwo ręcznie zapytania do bazy danych mogę wykonać tzn. bez datasetu…

Będzie działało (choć dobrze by było, żeby hosting korzystał z tej samej wersji MySQL, co Ty korzystasz lokalnie). Jedyne co musisz zrobić to podmienić connection string w pliku konfiguracyjnym aplikacji (app.config). Reszta zostaje bez zmian. W sumie możesz sprawdzić już teraz, czy to ruszy na tym db4free. Podmień connection string i spróbuj uruchomić aplikację.

Ja niestety żadnego hostingu Ci nie polecę, bo nie korzystam. Kiedyś bawiłem się cba.pl i chyba niczym więcej. Dodam, że cba.pl się tutaj nie sprawdzi z jednego prostego powodu http://www.cba.pl/forum/viewtopic.php?f=10&t=10921.

Piszesz to w kategoriach zalet czy wad?

Pisząc o “encjach” masz na myśli klasy będące odwzorowaniem bazodanowych tabel?

Zalet, dlatego pisałem, że ważne jest, żeby mu ten Connector działał.

Tak, choć przez odwzorowanie rozumiem nie tylko odwzorowanie tabel, ale też relacji między nimi (poprzez referencje w klasach).

I gdzie tu jest ta zaleta? Musi mieć najpierw bazę danych, żeby sobie te klasy automatycznie wygenerować. W czym to jest lepsze od wygenerowania bazy na podstawie struktury klas?

Przecież tą bazę danych ma już gotową, więc po co ma ręcznie pisać klasy. Podejście code first nie ma tu zupełnie sensu.

Czyli nawet jak masz bazę danych gotowych, to wszystko robisz ręcznie?