Visual Studio Final Application After Part 1

Programowanie aplikacji w C# .NET – Password Storage – Część 1
10 grudnia 2015 | Po pracy

W dzisiejszym artykule chciałem przybliżyć prostotę oraz łatwość tworzenia aplikacji w moim ulubionym języku C# z wykorzystaniem .NET. Programowanie nie jest takie straszne jak go malują. Tematem będzie stworzenie aplikacji działającej jako bank haseł do serwisów klienckich, skrzynek e-mail itp.
Z założenia aplikacja będzie się łączyć z klienta desktopowego z serwerem MySQL i podawać dane zwrotne. Klienta właśnie napiszemy w C#.NET
Aby zabezpieczyć bazę dane w niej będą szyfrowane, tak aby tylko osoba posiadająca program była w stanie dane te odczytać.
Być może okaże się konieczne zastosowanie uprawnień. Kto wie co się będzie działo później :).

 

W tym artykule skupię się na podstawach „jak zacząć” i w kolejnych artykułach rozwinę temat. Jak pojawią się ciekawe komentarze również z chęcią zaimplementuje co ciekawsze pomysły.

Programatorem, który wykorzystuje do codziennej pracy jest Visual Studio 2013. Jest darmowy – chociaż nie wiem czy jeszcze dostępy. Na 100 % można dorwać młodszego brat Visual Studio 2015 Community.

A więc zaczynamy. Odpalamy program i wybieramy Nowy projekt. Nazwać go można jak się chce. Ja wymyśliłem okrutną nazwę Password Storage Space.

 

Visual Studio Create New Application

 

Naszym oczom zaprezentuje się okno projektowania aplikacji a na pierwszy ogień idzie Formatka. Jest czysta niczym zakonnica po święceniach. W prawym dolnym rogu widzimy Properties tam też musimy odszukać ustawienia dla Name które zmieniamy na FormMain oraz Text który ustawimy na Password Storage Space.

 

Visual Studio Main Window

 

Z Toolbox‚a dodajemy TableLayoutPanel (przeciągamy na nasz formularz) i modelujemy do 3 wierszy o wysokości: 100 px, 100%, 100 px. W Properties ustawiamy Dock na Fill aby Layout rozlał nam się na całej formatce.
Do każdej z tej sekcji dodajemy Panel i ustawiamy Dock in Parent Container

 

Visual Studio Application Design Beginning

 

Teraz najlepsze:
W centralnym wierszu dodajemy DataGridView, Tutaj również ustawiamy Dock in Parent Container i zmieniamy ustawienie Name na dataGridViewPasswords

W górnym wierszu dodajemy Group Box i w Properties ustawiamy dla Dock  – Left oraz Text na Filtry.
Do naszego groupBox1 dodajemy z Toolbox’a Label oraz TextBox. Dla TextBoxa ustalamy Name na textBoxValueFilter. W Label ustawienie Text zmianiamy na np. Wpisz nazwę serwisu.

Dla dataGridViewPasswords ustawiamy jeszcze wszystkie opcje AllowUserToXXX na False. Cała obsługa będzie działała programowo.
W dolnej sekcji natomiast dodajemy 4 x Button o rozmiarach (Properties Size) 64 ; 64 tak aby później można było wykorzystać jakieś ciekawe ikonki.

Nazywamy je zmieniając Name oraz Text odpowiednio: buttonCancelWyjdź, buttonAddDodaj, buttonEditEdytuj, buttonRemoveUsuń, buttonRefreshWczytaj

Finalnie nasze okienko wygląda o tak:

 

Visual Studio Application Design

Teraz musimy stworzyć sobie przestrzeń dla danych. w tym celu łapiemy dowolny hosting, który da radę utworzyć bazę danych oraz pozwoli na dostęp z dowolnego IP.
Dla celów szkoleniowych wykorzystam stary dobry XAMPP oraz localhost.

Utworzę sobie bazę, która będzie się nazywać storagespacepasswd z collation utf8_polish_ci.
Tabela będzie się nazywać passwords i będzie posiadać 4 kolumny.
Skrypt zakładający tabelę poniżej:

CREATE TABLE IF NOT EXISTS `passwords` (
`id` int(12) NOT NULL,
`service` varchar(255) COLLATE utf8_polish_ci NOT NULL,
`value` varchar(255) COLLATE utf8_polish_ci NOT NULL,
`note` text COLLATE utf8_polish_ci
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;


ALTER TABLE `passwords`
ADD PRIMARY KEY (`id`);

Jako, że na tej lekcji 🙂 nie będę się skupiał na bezpieczeństwie tabela będzie posiadać narazie poja jawne varchar.

No to teraz jesteśmy przygotowani na dane.
Tak aby sprawdzić drugą z operacji w CRUD czyli Read zostawię jeden rekord o dowolnej treści np:

INSERT INTO `storagespacepasswd`.`passwords` (`id`, `service`, `value`, `note`) VALUES (NULL, 'info@arkonsoft.pl', 'nietakiehasłostraszne', 'hasło dla skrzynki e-mail POP3....');

Insert jest, dane są . Wracamy więc do naszej aplikacji:

Zazwyczaj nauczony praktyką wszelakie sprawy dotyczące połączenia z bazami umieszczam w osobnej klasie.
Tym razem robię podobnie i utworzę klasę MySQLDB.

Visual Studio Solution Explorer

 

W tym celu naciskam prawym przyciskiem  myszki na nazwę naszego projektu w Solution Explorer a następnie wybieram Add -> New Item.

 

Visual Studio Create New Class

Potem wybieram Class i na końcu nazwam ją zgodnie z tym co napisałem powyżej i wciskamy Add na dole po prawej stronie.

 

Aby otrzymać wszelakie możliwości zabawy MySql musimy dodać sobie jeszcze bibliotekę. Wchodzimy Reference i wybieramy MySql.Data.dll.

 

Visual Studio Add MySQLConnector

O … nie ma jej :). Aby było to jednak możliwe musicie ściągnąć sobie z netu MySQLConnectorNet. Link na dole artykułu.

Teraz dodajemy na samej górze klasy przed namespace:

using MySql.Data.MySqlClient;

 

Tworzymy teraz sobie klasę publiczną będącą podklasą naszej MySQLDB


public MySqlDB()
{
try
{
connection = new MySqlConnection(@"Server=localhost; database=storagespacepasswd; uid=userbazydanych; password=jakieshaslo; port=3306; charset=utf8; Convert Zero Datetime=True");

}
catch (MySqlException)
{
MessageBox.Show("Mam problem z połączeniem do bazy. Sprawdź dane połączenia.");
}

}

Klasa ta pomoże nam się łączyć z bazą w metodach.
Aby można było dodać zmienną DataSet,  którą będziemy przekazywali dane, musimy dodać również na początku pliku using System.Data;

Utworzono teraz 4 metody dla operacji CRUD’a

public DataSet readRows()
{

connection.Open();
MySqlDataAdapter dataAdapterRead = new MySqlDataAdapter();
MySqlCommand commandRead = new MySqlCommand();
commandRead.Connection = connection;
commandRead.CommandText = "select * from passwords";

dataAdapterRead.SelectCommand = commandRead;
DataSet dataSetForRead = new DataSet();
dataAdapterRead.Fill(dataSetForRead)

connection.Close();
connection.Dispose();

return dataSetForRead;
}

Ta metoda zwraca dane typu DataSet.  Opiszę teraz kolejno co robi.  Najpierw otwiera połączenie connection.Open(). Następnie tworzy dataAdapterRead dla przetwarzania danych z mySQL.  Następnie ustawia commandRead czyli zapytanie – jego treść oraz połączenie. Odpalamy przez dataAdapterRead.SelectCommand i ładujemy dane do dataSetForRead z wykorzystaniem Fill. Zamykamy i czyścimy połączenie. Następnie zwracamy dane w dataSetForRead.

public int createRow(string service, string value, string note)
{
int id = 0;

connection.Open();
MySqlCommand commandCreate = new MySqlCommand();
commandCreate.Connection = connection;
commandCreate.CommandText = @"insert into passwords(service, value, note)
VALUES (@service, @value, @note);
select last_insert_id();"
commandCreate.Parameters.Add(new MySqlParameter("service", service));
commandCreate.Parameters.Add(new MySqlParameter("value", value));
commandCreate.Parameters.Add(new MySqlParameter("note", note));

id = Convert.ToInt32(commandCreate.ExecuteScalar());

connection.Close();
connection.Dispose();

return id;
}

w createRow dzieje się podobnie. dochodzi nam jeszcze Parameters.Add, które dodaje zmienną do zapytania oraz Convert.ToInt32(commandCreate.ExecuteScalar()), które zwraca zmienną skalarną konwerując ją do int. Int jest zwracanym identyfikatorem dla nowo powstałego rekordu.

public int updateRow(int id, string service, string value, string note)
{
connection.Open();
MySqlCommand commandUpdate = new MySqlCommand();
commandUpdate.Connection = connection;
commandUpdate.CommandText = @"update passwords set service = @service, value = value, note = @note WHERE id = @id);";

commandUpdate.Parameters.Add(new MySqlParameter("id", id));
commandUpdate.Parameters.Add(new MySqlParameter("service", service));
commandUpdate.Parameters.Add(new MySqlParameter("value", value));
commandUpdate.Parameters.Add(new MySqlParameter("note", note));

commandUpdate.ExecuteNonQuery();

connection.Close();
connection.Dispose();

return id;
}

W updateRow dochodzi nam metoda klasy MySQL ExecuteNonQuery() .  Metoda ta wywołuje zapytanie do bazy ale nie zwraca rekordów. Wykorzystuje się ją właśnie do zapytań typu Update, Insert,Delete.

public void deleteRow(int id)
{
connection.Open();
MySqlCommand commandDelete = new MySqlCommand();
commandDelete.Connection = connection;
commandDelete.CommandText = @"delete from passwords WHERE id = @id);";

commandDelete.Parameters.Add(new MySqlParameter("id", id));

commandDelete.ExecuteNonQuery();

connection.Close();
connection.Dispose();

}

w deleteRow nie dzieje się nic co wymagało by dodatkowego tłumaczenia.

Aby nasza klasa nie wyrzuciła jeszcze błędu w momencie braku połączenia wywołując MessageBox musimy dodać jeszcze na początku pliku linię using System.Windows.Forms;

Teraz wracamy do naszego okna głównego aplikacji i prawym przyciskiem w Solution Explorer na  Form1 wybieramy View Code. Jest oczywiście dużo możliwości wejścia w kod. Inne znane to wybranie elementu na formatce i w większości sytuacji po prawym przycisku myszki będziemy mieli w menu kontekstowym również opcję View Code.
Musimy teraz stworzyć funkcję, która będzie nam wczytywała dane do tabeli. Filtrowaniem zajmiemy się w kolejnych częściach.
Nasza metoda wywołująca dane do tabeli wyglądać będzie mniej więcej tak:

private void refreshPasswordsTable()
{

dataGridViewPasswords.DataSource = null;
dataGridViewPasswords.Rows.Clear();

MySqlDB mySql = new MySqlDB();

DataSet passwordsDataSet = mySql.readRows();

DataTable passwordsDataTable = passwordsDataSet.Tables[0];

DataView passwordsDataView = new DataView(passwordsDataTable);

dataGridViewPasswords.AutoGenerateColumns = true;
dataGridViewPasswords.DataSource = passwordsDataView;

}

 

Teraz ustawmy jej wykonanie. Wchodzimy w Form1.cs[Design] oznaczamy górną listwę tak aby w Properties pojawił się FormMain.
Teraz przełączamy się na „błyskawicę” czyli w zdarzenia.
W evencie Load wpisujemy i naszą metodę. Finalnie wygląda to tak:


private void FormMain_Load(object sender, EventArgs e)
{
refreshPasswordsTable();
} 

 

Po próbie Debug aplikacja działa na wejściu wyświetlając umieszczony wcześniej rekord.

Na tym zakończę lekcję pierwszą. Jeszcze się spotkamy.

W części drugiej poruszę następujące kwestie:

  • konfiguracja DataGridView,
  • uwzględnianie filtru nazwy,
  • Dodawanie,
  • Usuwanie,
  • Edycja rekordu.

Serdecznie zapraszam.

Mam prośbę, że dostanę od Was informację zwrotną, co poprawić, na czym się skupić i „dlaczego mam błędy”.

 

Przydatne linki:

Visual Studio Community – https://www.visualstudio.com/pl-pl/downloads/download-visual-studio-vs.aspx

MySQLConnectorNet – https://dev.mysql.com/downloads/connector/net/

Komentarze


Oddział Staszów:

Adres: ul. Krakowska 49/2
28-200 Staszów

Godziny otwarcia:
pon-pt - [9:00-17:00], sb - [8:00-12:00]

E-mail: info@arkonsoft.pl

Telefon: 883-773-960

Oddział Lublin:

Godziny otwarcia:
pon-pt - [9:00-17:00]

E-mail: info@arkonsoft.pl

Telefon: 883-773-020

Oddział Warszawa:

Adres: ul. Cypryjska 2a
02-761 Warszawa

Godziny otwarcia:
pon-pt - [9:00-17:00]

E-mail: info@arkonsoft.pl

Telefon: 883-773-960

Zadaj nam pytanie on-line