Mamy własną ORM, której używamy tutaj, i dostarczamy silnie typowane opakowania dla wszystkich naszych tabel db. Pozwalamy również na wykonanie słabo wpisywanego SQL ad-hoc, ale zapytania te nadal przechodzą przez tę samą klasę, aby uzyskać wartości z czytnika danych.C# Dostęp do bazy danych: DBNull kontra null
Podczas ulepszania tej klasy do pracy z Oracle natknęliśmy się na interesujące pytanie. Czy lepiej jest użyć DBNull.Value, lub null? Czy są jakieś korzyści z używania DBNull.Value? Wydaje się, że bardziej "poprawne" jest użycie wartości null, ponieważ oddzieliliśmy się od świata DB, ale są implikacje (nie można po prostu ślepo ToString()
, gdy wartość jest na przykład pusta), więc jest to zdecydowanie coś, co musimy zrobić, aby świadoma decyzja o.
Myślę, że nadal istnieją pewne zastosowania dla DBNull. Przynajmniej z sqlite mogę przetestować, czy wartość zwrócona przez ExecuteScalar() jest jawnie przechowywana w bazie danych, czy też nie. Rozważ tabelę foo (int, b int); z pojedynczym wierszem (1, null). Gdybyśmy wykonywali ExecuteScalar w poleceniu "SELECT b FROM foo WHERE A = 1", zwróciliby DBNull.Value (wiersz istnieje, a przechowywana jest wartość pusta). Gdybym zadzwonił do ExecuteScalar na "SELECT b FROM foo WHERE A = 2", zwróciłby on wartość null (żaden taki wiersz nie istnieje). Prawdopodobnie można osiągnąć ten sam wynik z DataReaderem, ale doceniam wygodę. – fostandy
Interesujące. Korzystając z ORM dla dostępu do bazy danych, nie często jawnie używam ExecuteScalar w moim kodzie. Zwykle kończę pobieranie pełnych obiektów i patrzenie na ich wartości w ten sposób. Jeśli więc sama jednostka ma wartość zerową, to jedna rzecz, a jeśli wartość jest zerowa, to jest coś innego. Po prostu różne sposoby robienia tego.Przyznaję, że ExecuteScalar jest bardziej wydajny, jeśli potrzebujesz tylko jednej wartości. – jeremcc