SQLDataReader проблема с чтением нулевых значений - PullRequest
0 голосов
/ 19 июня 2019

У меня проблема с SQLDataReader, когда возникает ситуация, когда у меня одна строка данных, а один или два столбца (поля) имеют нулевое значение.

Кто-нибудь может помочь с этим? Нулевые значения относятся к типу данных string, float и datetime.

Первый метод:

public class SpajanjeCollection:ObservableCollection<Spajanje>
{
    public static SpajanjeCollection GetAllSpajanjes() 
    {
        SpajanjeCollection spajanjes = new SpajanjeCollection();  
        Spajanje spajanje = null;  

        using (SqlConnection conn = new SqlConnection())  
        {
            conn.ConnectionString = ConfigurationManager.ConnectionStrings["ConnString"].ToString();    
            conn.Open();    

            SqlCommand command = new SqlCommand("SELECT Ponude.IdPonude, Ponude.SifraProizvoda, Proizvodi.Naziv, Proizvodi.Opis, Proizvodi.PocetnaCijena, Ponude.PocetakAukcije, Users.UserName, Ponude.PonudjenaCijena, Ponude.ZavrsetakAukcije, Ponude.Status FROM  Ponude LEFT OUTER JOIN Users ON Ponude.Kupac = Users.UserName INNER JOIN Proizvodi ON Ponude.SifraProizvoda = Proizvodi.Id", conn);

            using (SqlDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())   
                {
                    spajanje = Spajanje.GetSpajanjeFromResultSet(reader);
                    spajanjes.Add(spajanje);    
                }
            }
        }
        return spajanjes;   
    }
}

Второй метод чтения данных:

    public static Spajanje GetSpajanjeFromResultSet(SqlDataReader reader) 
    {
        Spajanje spajanje = new Spajanje(Convert.ToInt16(reader["IdPonude"]), Convert.ToInt16(reader["SifraProizvoda"]), Convert.ToString(reader["Naziv"]), Convert.ToString(reader["Opis"]), float.Parse(reader["PocetnaCijena"].ToString()), (DateTime?)reader["PocetakAukcije"], Convert.ToString(reader["UserName"]), float.Parse(reader["PonudjenaCijena"].ToString()), (DateTime?)reader["ZavrsetakAukcije"], Convert.ToString(reader["Status"]));

        return spajanje;    
    }

1 Ответ

0 голосов
/ 20 июня 2019

SqlDataReader не будет передавать NULL значения напрямую.

Чтобы обойти это, вы можете использовать выражение T-SQL COALESCE (...) , чтобы принудительно преобразовать значения NULL в другие ненулевые значения, такие как 0 для * 1007. * column или '' для столбцов char / nchar. Имейте в виду, что использование COALESCE для преобразования значений NULL в «магические» числа или константы может скрыть истинное значение нулевых значений. т. е. если база данных использует NULL для указания «дата не указана», но в конечном итоге вы используете «1900-01-01», чтобы указать, что в коде необходимо убедиться, что вы никогда не рассчитываете возраст Аукциона с начальной датой ». 1900-01-01 ', иначе вы в конечном итоге будете показывать эти Аукционы первым по возрасту.

SqlCommand command = new SqlCommand("SELECT Ponude.IdPonude
    , COALESCE(Ponude.SifraProizvoda, -1)
    , COALESCE(Proizvodi.Naziv, '')
    , COALESCE(Proizvodi.Opis, '')
    , COALESCE(Proizvodi.PocetnaCijena, -1)
    , COALESCE(Ponude.PocetakAukcije, '1900-01-01')
    , COALESCE(Users.UserName, '')
    , COALESCE(Ponude.PonudjenaCijena, -1)
    , COALESCE(Ponude.ZavrsetakAukcije, -1)
    , COALESCE(Ponude.Status, -1) 
FROM  Ponude 
    LEFT OUTER JOIN Users ON Ponude.Kupac = Users.UserName 
    INNER JOIN Proizvodi ON Ponude.SifraProizvoda = Proizvodi.Id;", conn);

Кроме того, вы можете проверить, является ли каждое отдельное значение нулевым, прежде чем пытаться присвоить значение переменной, используя оператор IsNull.

if (myValue == null)
  myValue = new MyValue();
myNewValue = myValue;

Другой, возможно, более элегантный способ:

myNewValue = myValue ?? new MyValue();
...