Odczyt pustych pól z bazy danych

0

Witam

Mam funkcję sprawdzającą czy dane ID produktu istnieje w bazie danych, jeśli tak to pobiera wartości poszczególnych pól dla danego ID i przypisuje zmiennych. Problem pojawia się gdy jedno z pól zawiera null, np dla nowo wstawionych kolumn. Zrobiłem taką funkcję w klasie nadrzędnej:

        protected int conv (object data)
        {
            int dt = 0;
            if(DBNull.Value.Equals(data))
            {
                dt=(int)data;
            }

            return dt;
        }

Oraz w późniejszym czasie drugą wersję

        protected int conv (object data)
        {
            int dt = 0;
            if(!Convert.IsDBNull(data))
            {
                dt=(int)data;
            }

            return dt;
        }

A następnie w funkcji pobierającej dane z bazy:


            using(FbConnection conn = new FbConnection(connText))
            {
                conn.Open();

                using(FbCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandType = System.Data.CommandType.Text;
                    cmd.CommandText = "select * from MAINDATA where ID = '"+id+"'";

                    using(FbDataReader reader = cmd.ExecuteReader())
                    {
                        if (reader.HasRows)
                        {
                            while(reader.Read())
                            {
                                int mat = conv(reader.GetInt32(reader.GetOrdinal("MAT")));
                                int ln = conv(reader.GetInt32(reader.GetOrdinal("LN")));
                        }

                    }
                }

I gdy pole zawiera null dostaję komunikat:

Object cannot be cast from DBNull to other types.

Pola których wartość jest różna od null wczytują się normalnie.

Długo juz spędziłem czasu nad tym problemem, niestety nie potrafię znaleŹć rozwiązania. Może ktoś rzucić okiem i pomóc ?

0

Korzystaj z null'owalnych typów. Np:

 int?
0

Ale dalczego jak wartością zwracaną jest int, a parametrem może być dbnull ? Jeśli jest to wartością zwracana jest równa 0.

0

Skoro sam napisałeś, że nowe kolumny w bazie są NULL czyli null'owalne to znaczy, że np typ int może przybierać wartość null.

0

Ale funkcja conv sprawdza czy kolumna ma wartość null, jeśli tak to zwraca 0, jeśli nie to zwraca to co jest w kolumnie.

0

W której linijce dostajesz ten błąd?

0

W tej

int ln = conv(reader.GetInt32(reader.GetOrdinal("LN")));

Tu w tej kolumnie właśnie jest wartość null.

Jeśli ręcznie zmienię w bazie na wartość liczbową to nie ma żadnego błędu.

1

Czyli nie jesteś jeszcze w metodzie conv... Nie znalazłem specyfikacji ale obstawiam że GetInt32 nawala. Być może ona nie jest w stanie poradzić sobie z null'em.

1

to tak nie działa - jeśli już to najpierw musisz sprawdzić czy pole nie jest null a dopiero potem, jeśli nie jest null pobrać jego wartość przez GetInt32

0

Tak, faktycznie macie rację GetInt32 musi mieć podany string jako parametr. A tu w tym przypadku było null. Poprawiłem

        protected int conv (object data)
        {
            int ret = 0;

            if(!DBNull.Value.Equals(data))
            {
                ret = Convert.ToInt32(data);
            }

            return ret;
        }

Oraz dodałem drugą przeciążoną metodę zwracającą typ DateTime.

A później wywołanie

int lm = conv(reader.GetValue(reader.GetOrdinal("field name")));

I teraz działa jak należy.

Za pomoc dziękuję.

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