我正在使用ADO.NET Entity框架来连接数据库并获取数据。我想如果对象中没有数据,如果它已满,它将写入“EMPTY FIELD”,而不是从db写入listview coloumn数据。当objectcontext中有一个null对象时,我收到'System.NullReferenceException'错误。返回“EMPTY ROW”字符串。
这是我的代码:
using (ITSEntities arama = new ITSEntities())
{
var sql = "SELECT VALUE s_tesis FROM ITSEntities.TB_SAGLIK_TESIS AS s_tesis WHERE s_tesis.TESIS_AD like @p1";
ObjectQuery<TB_SAGLIK_TESIS> sorgu = new ObjectQuery<TB_SAGLIK_TESIS>(sql, arama).Include("TB_IL").Include("TB_TESIS_TIPI").Include("TB_TESIS_TURU");
sorgu.Parameters.Add(new ObjectParameter("p1", String.Format("{0}%", btnAra.Text)));
listTesis.Items.Clear();
foreach (var item in sorgu)
{
ListViewItem listitem = new ListViewItem { Text = item.KODU.ToString() };
listitem.SubItems.Add(item.TESIS_AD);
listitem.SubItems.Add(String.IsNullOrEmpty(item.TB_IL.ADI) ? "EMPTY ROW" : item.TB_IL.ADI);
listitem.SubItems.Add(String.IsNullOrEmpty(item.TB_TESIS_TIPI.TIP_AD) ? "EMPTY ROW" : item.TB_TESIS_TIPI.TIP_AD);
listitem.SubItems.Add(String.IsNullOrEmpty(item.TB_TESIS_TURU.TESIS_TURU) ? "EMPTY ROW" :item.TB_TESIS_TURU.TESIS_TURU);
listTesis.Items.Add(listitem);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.InnerException.ToString());
}
答案 0 :(得分:1)
我不知道EF,但您在以下行中取消引用了2个对象:
ListViewItem listitem = new ListViewItem { Text = item.KODU.ToString() };
listitem.SubItems.Add(String.IsNullOrEmpty(item.TB_IL.ADI) ? "EMPTY ROW" : item.TB_IL.ADI);
listitem.SubItems.Add(String.IsNullOrEmpty(item.TB_TESIS_TIPI.TIP_AD) ? "EMPTY ROW" : item.TB_TESIS_TIPI.TIP_AD);
listitem.SubItems.Add(String.IsNullOrEmpty(item.TB_TESIS_TURU.TESIS_TURU
如果容器对象(KODU
,TB_IL
,TB_TESIS_TIPI
。或TB_TESIS_TURU
)永远为null,那么您将获得NullReferenceException。
我的 guess 是这些是表名,有些行没有对应的JOIN表。无论如何,您可能需要将其重写为:
ListViewItem listitem = new ListViewItem { Text = (item.KODU ?? "").ToString() };
listitem.SubItems.Add(
(item.TB_TL == null || String.IsNullOrEmpty(item.TB_IL.ADI))
? "EMPTY ROW" : item.TB_IL.ADI
);
为了使它更清洁,方法:
string EmptyRowIfNull<T>(T o, Func<T, string> p) {
string s;
if (o != null) {
s = p(o);
}
return string.IsNullOrEmpty(s) ? "EMPTY ROW" : s;
}
listitem.SubItems.Add(EmptyRowIfNull(item.TB_IL, t => t.ADI));
listitem.SubItems.Add(EmptyRowIfNull(item.TB_TESIS_TIPI, t => t.TIP_AD));
listitem.SubItems.Add(EmptyRowIfNull(item.TB_TESIS_TURU, t => t.TESIS_TURU));
答案 1 :(得分:0)
您可能想尝试item.attr.IsNull()
- 我相信强制转换为字符串会导致它在IsNullOrEmpty测试之前将该项标记为null。
答案 2 :(得分:0)
我没有使用实体框架。但是,当SQL查询没有返回任何行时,你可以枚举“sorgu”吗?
要测试它,你可以在try / catch中包装foreach并捕获NullReferenceException。有些人会使用这个NullReferenceException catch来设置你正在做的事情,但我不推荐它。