Korzystam z SQLdatareader do tworzenia POCO z bazy danych. Kod działa, z wyjątkiem przypadków napotkania wartości zerowej w bazie danych. Na przykład jeśli kolumna FirstName w bazie danych zawiera wartość null, zgłaszany jest wyjątek.
employee.FirstName = sqlreader.GetString(indexFirstName);
Jaki jest najlepszy sposób obsługi wartości zerowych w tej sytuacji?
c#
sqldatareader
DenaliHardtail
źródło
źródło
int colIndex = reader.GetOrdinal(fieldname);
i łatwo przeciążyć funkcję @ marc_sSafeGetString
.Należy użyć
as
operatora w połączeniu z??
operatorem dla wartości domyślnych. Typy wartości będą musiały być odczytywane jako wartości zerowe i mieć wartość domyślną.as
Operator obsługuje casting tym czekiem na DBNull.źródło
sqlreader[indexAge] as string ?? ""
, zawsze dostaniesz""
. Zastanów się, czy naprawdę(int?)sqlreader[indexAge] ?? defaultValue
tego chcesz , więc jeśli zmienisz SQL, otrzymasz wyjątki zamiast złych wartości. @ Stevo3000: domyślnie (int) wynosi 0, a nie -1. @Chris: Upewnij się, że używasz tego, którego naprawdę chcesz.W przypadku ciągu możesz po prostu rzutować wersję obiektu (dostępną za pomocą operatora tablicowego) i zakończyć ciągiem zerowym dla wartości zerowych:
lub
W przypadku liczb całkowitych, jeśli rzutujesz na zerowy int, możesz użyć GetValueOrDefault ()
lub operator zerowego koalescencji (
??
).źródło
null
ale zamiast tego obiektem DBNull. Różnica między tymi dwiema instrukcjami polega na tym, że pierwsza zawiedzie, jeśli nie jest łańcuchem, a druga zwróci null, jeśli nie będzie łańcuchem.IsDbNull(int)
jest zwykle znacznie wolniejszy niż przy użyciu metod takich jakGetSqlDateTime
a następnie porównywanieDBNull.Value
. Wypróbuj następujące metody rozszerzenia dlaSqlDataReader
.Użyj ich w ten sposób:
źródło
Jednym ze sposobów na to jest sprawdzenie zerowych wartości db:
źródło
reader.IsDbNull(ColumnIndex)
działa, jak mówi wiele odpowiedzi.I chcę wspomnieć, jeśli pracujesz z nazwami kolumn, po prostu porównywanie typów może być wygodniejsze.
źródło
Nie sądzę, że jest NULL kolumny , gdy wiersze są zwracane w centrum danych przy użyciu nazwy kolumny.
Jeśli to zrobisz
datareader["columnName"].ToString();
, zawsze otrzymasz wartość, która może być pustym ciągiem (String.Empty
jeśli musisz porównać).Użyłbym następujących i nie martwiłbym się zbytnio:
źródło
To rozwiązanie jest mniej zależne od dostawcy i działa z SQL, OleDB i MySQL Reader:
źródło
To, co zwykle robię, to zastępowanie wartości zerowych w instrukcji SELECT czymś odpowiednim.
Tutaj zastępuję każdy null pustym łańcuchem. W takim przypadku kod nie spowoduje błędu.
źródło
Możesz napisać funkcję Ogólną, aby sprawdzić Null i dołączyć wartość domyślną, gdy jest NULL. Zadzwoń do tego podczas czytania Datareader
Podczas czytania skorzystaj z Datareader
źródło
Sprawdź,
sqlreader.IsDBNull(indexFirstName)
zanim spróbujesz go przeczytać.źródło
jak o tworzeniu metod pomocniczych
Na ciąg
Stosowanie
Dla Int
Stosowanie
Na datę
Stosowanie
Uwaga: dla DateTime zadeklaruj varialbe jako
źródło
Jako dodatek do odpowiedzi autorstwa marc_s można użyć bardziej ogólnej metody rozszerzenia, aby uzyskać wartości z SqlDataReader:
źródło
Wpływając z getpsyched na odpowiedź , stworzyłem metody rodzajowe, których wartość kolumna sprawdza jego nazwa
Stosowanie:
źródło
Myślę, że chcesz użyć:
źródło
Używamy szeregu metod statycznych, aby wyciągnąć wszystkie wartości z naszych czytników danych. Więc w tym przypadku dzwonilibyśmy
DBUtils.GetString(sqlreader(indexFirstName))
. Korzyścią z tworzenia metod statycznych / współużytkowanych jest to, że nie musisz ciągle wykonywać tych samych kontroli ...Metody statyczne zawierałyby kod do sprawdzania wartości zerowych (zobacz inne odpowiedzi na tej stronie).
źródło
Możesz użyć operatora warunkowego:
źródło
Jest tu wiele odpowiedzi z użytecznymi informacjami (i kilkoma błędnymi informacjami), chciałbym zebrać je wszystkie razem.
Krótka odpowiedź na pytanie to sprawdzenie DBNull - prawie wszyscy zgadzają się w tej kwestii :)
Zamiast używać metody pomocniczej do odczytywania wartości zerowych dla każdego typu danych SQL, ogólna metoda pozwala nam rozwiązać ten problem przy znacznie mniejszym kodzie. Jednak nie możesz mieć jednej ogólnej metody zarówno dla wartości dopuszczających wartości zerowe, jak i typów referencyjnych. Jest to omówione szczegółowo w typie dopuszczającym wartości zerowe jako możliwy parametr ogólny? i ogólne ograniczenie typu C # dla wszystkiego, co ma wartość null .
Tak więc, podążając za odpowiedziami z @ZXX i @getpsyched, otrzymujemy 2 metody uzyskiwania wartości zerowych, a ja dodałem 3 dla wartości innych niż null (uzupełnia zestaw na podstawie nazewnictwa metod).
Zwykle używam nazw kolumn, zmieniam je, jeśli używasz indeksów kolumn. Na podstawie tych nazw metod mogę stwierdzić, czy oczekuję, że dane będą zerowalne, czy nie, co jest całkiem przydatne, gdy patrzę na kod napisany dawno temu.
Porady;
Wreszcie, podczas testowania powyższych metod we wszystkich typach danych SQL Server odkryłem, że nie możesz bezpośrednio uzyskać char [] z SqlDataReader, jeśli chcesz char [], musisz uzyskać ciąg znaków i użyć ToCharArray ().
źródło
Używam kodu wymienionego poniżej do obsługi pustych komórek w arkuszu Excel, który jest wczytywany do danych.
źródło
źródło
i / lub użyj operatora trójskładnikowego z przypisaniem:
zamień wartość domyślną (gdy null) odpowiednio dla każdego typu właściwości ...
źródło
Ta metoda zależy od indexFirstName, która powinna być liczbą porządkową kolumny liczoną od zera.
Jeśli nie znasz indeksu kolumny, ale nie chcesz sprawdzić nazwy, możesz zamiast tego użyć tej metody rozszerzenia:
I zastosuj następującą metodę:
źródło
Stare pytanie, ale może ktoś nadal potrzebuje odpowiedzi
w rzeczywistości pracowałem nad tym problemem w ten sposób
Dla int:
to samo dla ciągu po prostu zwróć „” zamiast 0, ponieważ „” jest pustym ciągiem
więc możesz go używać jak
i
bardzo elastyczny, dzięki czemu można wstawić dowolne zapytanie w celu odczytania dowolnej kolumny i nigdy nie zwróci ono z błędem
źródło
Oto klasa pomocnicza, której inni mogą użyć, jeśli będą potrzebować, na podstawie odpowiedzi @marc_s:
źródło
Konwertuj uchwyty DbNull rozsądnie.
źródło
możesz to również sprawdzić
źródło
SqlDataReader