DbDataReader a ResultSet, szukanie optymalnego rozwiązania

0

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

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ś:

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.

2

Witam,

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

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

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

    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:

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

Pozdrawiam,

mr-owl

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.

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

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

0

Witam,

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

    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

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.

1

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

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.