Wyłapanie wyjątku generowanego przez sql

0

Witam, na chwilę obecną mam taki kod:

try
            {
                connection.Open();

                Command.Parameters.Clear();
                Command.Parameters.AddWithValue("@nazwa_uzykownika", name);
                Command.Parameters.AddWithValue("@login_uzytkownika", login);
                Command.Parameters.AddWithValue("@haslo_uzytkownika", bytePass);
                Command.Parameters.AddWithValue("@tel_uzytkownika", tel);
                Command.Parameters.AddWithValue("@email_uzytkownika", mail);
                Command.Parameters.AddWithValue("@data_utwo_uzytkownika", now);

                Command.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                error = true;
                MessageBox.Show(ex.Message);
            }
            finally
            {
                connection.Close();
            }

W tabeli Uzytkownik, kolumna login_uzytkownika zawiera UNIQUE, podczas próby dodania rekordu o identycznym loginie zgodnie z założeniem dostaję komunikat o błędzie. Szukam rozwiązania które pozwoli wychwycić wyjątki związane z UNIQUE tak aby użyc ErrorProvider i poinformować o tym, że taki login jest już zajęty?

1

Przed swoim catch dodaj jeszcze jeden, w nim przechwytuj SqlException i sprawdź właściwość ErrorCode. Przy naruszeniu UNIQUE kod błędu to chyba 2601.

A tak w ogóle, to ja bym najpierw sprawdzał, czy wartość istnieje, informował użytkownika, a dopiero potem ewentualnie próbował wstawiać.

0

I tak też jest robione, ale wypełnienie do końca pól znajdujących się na formatce zajmie trochę czasu użytkownikowi, a w tym czasie do bazy może trafić jakiś rekord którego login będzie identyczny...

... Dokładniej

catch (SqlException ex)
            {
                if (ex.Number == 2627)
                {
...
0

nie rozumiem.. w takim przypadku i tak zawsze dostaniesz "constraint violation", gdyz tak masz charakter danych na bazie zdefiniowany! jezeli tam jest UNIQUE na tej kolumnie, to nie wazne czy Ty czy ktos inny jest "twórcą" tego drugiego wiersza, Ty nie bedziesz mogl dostawic wiersza który łamałby UNIQUE. Ani Ty ani nikt inny. Baza przerywa taką operacje i potem (a dokladniej nie ona, tylko dbprovider.. ale to nie istotne) informuje Cię o tym fakcie poprzez wyjątek. Jedyne co mozesz zrobic, to zlapac wyjatek i pokazac uzytkownikowi informacje, ze "dane sa zle/juz istnieja, popraw dane albo spadaj"

w czym masz faktycznie problem? mam wrazenie ze pytasz o usuwanie objawow a nie przyczyn

1 użytkowników online, w tym zalogowanych: 0, gości: 1