DbDataReader a ResultSet, szukanie optymalnego rozwiązania

DbDataReader a ResultSet, szukanie optymalnego rozwiązania
DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1135
0

Mam program napisany w Javie w którym są linie jak ta:

Kopiuj
object.name = resultSet.getString(4); //ResultSet resultSet

ten getString() działa tak, że jak pole jest nullem to zwraca pusty string.

W .NET Core pisze podobnie tylko używam DbDataReader który ma metody jak GetString(). Problem polega na tym, że tutaj jak cos jest nullem to rzuca wyjątkiem. Czy jest jakis atrybut, albo inne rozwiązanie które to naprawi? Pisanie takiego czegoś:

Kopiuj
object.name = Convert.ToString(result.GetValue(4) == DBNull.Value ? string.Empty : result.GetValue(4));

nie jest zabawne.
Takich pól mam z ~30, a klas z takimi polami ponad setka. Szukam jakiegoś szybkiego rozwiązania.

mr-owl
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 206
2

Witam,

A nie możesz sprawdzić czy pole nie jest nullem przed pobraniem wartości?

Kopiuj
var field4 = string.Empty;
if(!result.IsDbNull(4))
{
field4 = result.GetString(4);
}

a globalnie można dodać sobie coś takiego:

Kopiuj
    public static class ExtensionMethods
    {
        public static string GetStringOrEmpty(this SqlDataReader sqlDataReader, int i)
        {
            var text = string.Empty;

            if (!sqlDataReader.IsDBNull(i))
            {
                text = sqlDataReader.GetString(i);
            }

            return text;
        }
    }

i teraz mamy:

Kopiuj
...
while (reader.Read())
{
var text = reader.GetStringOrEmpty(reader.GetOrdinal("field4"));
}
...

Pozdrawiam,

mr-owl

DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1135
0

@mr-owl i robić to dla bool, decima, int32, int 64, string, float, double? Kiedy np. w pythonie wystarczy zrobić dekorator. Nie wierzę, że w c# nie można tego zrobić w łatwy sposób.

mr-owl
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 206
1

Witam,

Nie przesadzasz? Napisanie 6-7 funkcji które możesz później wielokrotnie używać to aż tak nadmiarowa praca?

Pozdrawiam,

mr-owl

DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1135
0

@mr-owl może i przesadzam, ale dziwi mnie że w Javie jest coś takiego, a to podobno ona jest przestarzała. Trudno, skoro nie ma innego rozwiązania. Dzięki

mr-owl
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 206
0

Witam,

Możesz próbować tak jeśli chcesz mieć tylko stringi

Kopiuj
    public static class ExtensionMethods
    {
        public static string GetStringOrEmpty(this SqlDataReader sqlDataReader, int i)
        {
            var text = string.Empty;
 
            if (!sqlDataReader.IsDBNull(i))
            {
                text = sqlDataReader.GetValue(i).ToString();
            }
 
            return text;
        }
    }

Pozdrawiam,

mr-owl

neves
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 1114
1

Albo możesz użyć Dappera, wydajnościowo jest zbliżony do DbDataReader, i zdejmuje z programisty konieczność odpakowywania typów. Używa się go znacznie przyjemniej niż czystego ado.net'a.

FP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 132
1

Kiedyś miałem ten sam "problem". Zrobiłem tak jak kolega wyżej zaproponował, czyli z pomocą extension method.

Kopiuj
public static string TryGetString(this SqlDataReader reader, int columnIndex)
{
            if (!reader.IsDBNull(columnIndex))
                return reader.GetString(columnIndex);
            return string.Empty;
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.