当我遇到一行数据并且一列或多列(字段)的值为空时,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;
}
答案 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();