读取空值的SQLDataReader问题

时间:2019-06-19 19:17:34

标签: c# sql-server sqldatareader

当我遇到一行数据并且一列或多列(字段)的值为空时,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 :(得分:0)

SqlDataReader不会直接传递NULL值。

要解决此问题,您可以使用T-SQL COALESCE(...)表达式将NULL值强制为其他一些非空值,例如0列的int,或''用于char / nchar列。请注意,使用COALESCE将NULL值转换为“魔术”数字或常量可以隐藏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();