C# SQL Tutorial Połączenie: Dapper + Baza danych SQL Server wyjaśnione
W lekcji 10 serii "C# App Start to Finish" Tima Corey'a, Tim wyjaśnia, jak połączyć aplikację C# z bazą danych SQL Server używając Dapper. W poprzedniej lekcji aplikacja używała fałszywej warstwy dostępu do danych, która tylko udawała komunikację z SQL. W tym wideo Tim zastępuje ten kod-zastępcę rzeczywistą logiką połączenia SQL i pokazuje, jak ustawia prawdziwe połączenie z bazą danych w sposób czysty, skalowalny i łatwy do utrzymania.
Artykuł ten rozbija kluczowe pojęcia, które Tim omawia i wyjaśnia je w sposób zrozumiały, nawet jeśli jesteś nowy w połączeniach C# SQL lub SQL Server.
Konfiguracja projektu i porządkowanie
Tim rozpoczyna przeglądem struktury rozwiązania i potwierdza zmiany wprowadzone w poprzedniej lekcji. W Program.cs wyjaśnia, że dodał kod, aby połączyć się zarówno z SQL Server, jak i z bazą danych w pliku tekstowym, oraz zmienił formularz startowy na "Create Prize", aby natychmiast przetestować połączenie z bazą danych.
Następnie oczyszcza strukturę projektu, tworząc dwa foldery:
-
Modele
- Dostęp do danych
Zauważa, że to nie wpływa na funkcjonalność kodu źródłowego, ale pomaga w organizacji. Gdy wrócimy do projektu później, czysta struktura i spójne nazewnictwo ułatwiają jego utrzymanie i rozwijanie.
Dlaczego Dapper?
Tim wyjaśnia, że użyje Dapper jako ORM (Maper relacyjno-obiektowy) dla połączeń SQL. Dapper znajduje się między surowymi poleceniami SQL a wyższych poziomów ORM takich jak Entity Framework.
Tim preferuje Dapper, ponieważ jest:
-
Prawie tak szybki jak surowe ADO.NET
-
Prostszym niż Entity Framework
- Unika zbędnej złożoności i ciężkiego kodu szablonowego
Wspomina, że Entity Framework może być wolniejszy i cięższy, szczególnie dla małych aplikacji. Do swojego projektu Dapper dostarcza odpowiedniego balansu pomiędzy wydajnością i prostotą.
Instalacja Dapper
Tim demonstruje instalację Dapper przez Menedżera Pakietów NuGet w Visual Studio. Po instalacji Dapper pojawia się w referencjach projektu, a kod połączenia SQL staje się czysty i czytelny.
Dodawanie ciągu połączenia
Aby używać Dapper, potrzebujesz ciągu połączenia. Tim dodaje go do pliku app.config projektu UI, a nie projektu biblioteki, ponieważ biblioteka jest DLL i nie ma własnej konfiguracji.
Ciąg połączenia obejmuje:
-
Data Source (nazwa serwera lub domena maszyny)
-
Initial Catalog (nazwa bazy danych)
-
Integrated Security (uwierzytelnianie Windows)
-
Limit czasu połączenia
- User ID i Password (jeśli nie używasz uwierzytelniania Windows)
W przykładzie Tima używa on zaufanego połączenia, co oznacza uwierzytelnianie Windows:
Data Source=SQL2016;Initial Catalog=Tournaments;Integrated Security=True;
Podkreśla, że unika to przechowywania danych logowania użytkownika SQL Server w pliku.
GlobalConfig: Pobieranie ciągu połączenia
Aby pobrać ciąg połączenia, Tim dodaje metodę w GlobalConfig:
public static string GetConnectionString(string name)
{
return ConfigurationManager.ConnectionStrings[name].ConnectionString;
}
Ta metoda pobiera ciąg połączenia z pliku konfiguracyjnego i zwraca go. Tim dodaje również wymaganą referencję System.Configuration.
Tworzenie połączenia SQL
Tim usuwa kawałek kodu zastępczego i tworzy rzeczywiste SqlConnection używając:
using (IDbConnection connection = new SqlConnection(
GlobalConfig.GetConnectionString("tournaments")))
{
// SQL logic here
}
Używa interfejsu IDbConnection, aby móc zamieniać typy baz danych (SQL lub plik tekstowy) bez zmiany samego kodu.
Blok using jest ważny, ponieważ zapewnia automatyczne zamknięcie połączenia po wyjściu z bloku. Unika to otwartych połączeń, które mogą wyczerpać pulę połączeń lub powodować błędy na serwerze bazy danych.
Tworzenie procedury składowanej
Zamiast pisać surowy SQL wewnątrz C#, Tim używa procedury składowanej. Utrzymuje to logikę SQL w bazie danych i redukuje ryzyka takie jak zastrzyki SQL.
Tworzy on procedurę składowaną o nazwie:
dbo.SP_Prizes_Insert
Ta procedura przyjmuje parametry pasujące do tabeli z nagrodami:
-
@PlaceNumber
-
@PlaceName
-
@PrizeAmount
-
@PrizePercentage
- @ID (output)
Parametr output zwraca nowo wygenerowany ID używając:
SELECT @ID = SCOPE_IDENTITY()
Zapewnia to zwrócenie ID nowego rekordu do aplikacji C#.
Dynamiczne parametry w Dapper
Z powrotem w C#, Tim używa DynamicParameters Dappera do przesyłania parametrów do procedury składowanej:
var p = new DynamicParameters();
p.Add("@PlaceNumber", model.PlaceNumber);
p.Add("@PlaceName", model.PlaceName);
p.Add("@PrizeAmount", model.PrizeAmount);
p.Add("@PrizePercentage", model.PrizePercentage);
p.Add("@ID", 0, dbType: DbType.Int32, direction: ParameterDirection.Output);
ID jest oznaczony jako Output, a Dapper obsługuje mapowanie parametrów.
Wykonywanie procedury składowanej
Wykonuje procedurę składowaną:
connection.Execute("dbo.SP_Prizes_Insert", p, commandType: CommandType.StoredProcedure);
Execute jest używany, ponieważ wykonuje insert i nie zwraca wierszy jak instrukcja SELECT.
Po wykonaniu kod pobiera ID:
model.ID = p.Get<int>("@ID");
return model;
Testowanie i wyniki
Tim uruchamia aplikację, wypełnia formularz i klika Utwórz Nagrodę. Dane są pomyślnie wstawiane do bazy danych SQL Server. Testuje zarówno:
-
Kwota nagrody
- Procent nagrody
Obydwa działają, co potwierdza, że połączenie z bazą danych i procedura składowana działają poprawnie.
Wyzwanie projektowe: Wiele złączy danych (1:01:50)
Tim zwraca uwagę na problem z projektem: używanie jednocześnie złączy SQL i pliku tekstowego powoduje niespójne ID.
Dlatego zmienia projekt, aby w danym czasie działało tylko jedno złącze. Dodaje wyliczenie:
TypBazyDanych
{
SQL,
TextFile
}
Zapewnia to, że aplikacja zawsze używa spójnego typu bazy danych i zapobiega mieszaniu danych z różnych źródeł.
Wnioski
Lekcja 10 Tima Corey'a pokazuje podejście rzeczywiste do łączenia aplikacji C# z SQL Server używając Dapper. Porusza tematy:
-
Dodawanie ciągu połączenia
-
Korzystanie z SqlConnection
-
Bezpieczne otwieranie i zamykanie połączeń
-
Korzystanie z procedur składowanych
-
Unikanie zastrzyków SQL
- Właściwa architektura dla wielu źródeł danych
Jeśli chcesz czystego, szybkiego i łatwego do konserwacji sposobu łączenia C# z bazą danych SQL Server, ta lekcja jest doskonałym przewodnikiem.
