Cześć,
piszę aplikację z użyciem C# i SQL Server. Tworzę metody CRUD dotyczące klientów i ich pracowników (każdy klient może mieć ich wiele). Mam funkcję dodającą pracownika do bazy:
public static void Pracownik_Add(int klientId, Pracownik pracownik){
SqlConnection conn = new SqlConnection()...
if (conn.State == ConnectionState.Closed) conn.Open();
SqlCommand cmd = new SqlCommand("INSERT INTO kl_klienciPracownicy (klient_id, imie, nazwisko) VALUES (@klient_id, ....);", conn);
cmd.Parameters.AddWithValue("@klient_id", klientId);
cmd.Parameters.AddWithValue("@imie", pracownik.Imie);
...
cmd.ExecuteNonQuery();
if (conn.State == ConnectionState.Open) conn.Close();
}
Używam jej, gdy user dodaje pracownika do istniejącego już klienta (za pomocą dialogu edycji)
Problem jednak znajduje się w sytuacji, gdy klient jest dopiero dodawany. Używam do tego metody:
public static void Klient_Add(Klient klient){
SqlConnection conn = new ....
SqlCommand cmdKlientAdd = new SqlCommand("INSERT INTO kl_klienci (imie, nazwisko) OUTPUT INSERTED.ID VALUES (...);", conn);
int klientId = (int)cmdKlientAdd.ExecuteScalar();
// Dodałem już klienta i mam jego id. Chcę teraz dodać pracowników z nim powiązanym. Wymyśliłem dwa podejścia:
// 1. Działa, ale raczej obciąża bazę
foreach (Pracownik prac in klient.Pracownicy){ // gdzie klient.Pracownicy to lista
Pracownik_Add(klientId, prac);
}
// 2. Też działa, ale mam wrażenie, że można to zrobić lepiej:
StringBuilder sb = new StringBuilder("INSERT INTO kl_klienciPracownicy (klient_id, imie, nazwisko) VALUES ");
List<SqlParameter> parameters = new List<SqlParameter>();
int iloscWierszy = klient.Pracownicy.Count;
for (int i = 0; i < iloscWierszy; i++){
sb.Append($"(@klient_id, @imie{i}, @nazwisko{i})");
parameters.Add(new SqlParameter($"@imie{i}", klient.Pracownicy[i].Imie));
...
if (i != iloscWierszy - 1) sb.Append(",");
}
SqlCommand cmdPracownicyAdd = new SqlCommand(sb.ToString(), conn);
cmdPracownicyAdd.Parameters.AddWithValue("@klient_id", klientId);
cmdPracownicyAdd.Parameters.AddRange(parameters.ToArray());
cmdPracownicyAdd.ExecuteNonQuery();
...
}
Które rozwiązanie jest lepsze? Czy może jest jeszcze jakiś inny sposób?
Z góry dzięki