【问题标题】:What's the problem with this C# condition code?这个 C# 条件代码有什么问题?
【发布时间】:2009-08-08 00:48:09
【问题描述】:

我正在使用 ADO.NET 实体框架来连接数据库并获取数据。我想如果对象中没有数据,它会写“EMPTY FIELD”,如果它已满,它将写入来自数据库的listview列数据。当 objectcontext 中有空对象时,我收到“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());
        }

【问题讨论】:

    标签: c# entity-framework


    【解决方案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
    

    如果容器对象(KODUTB_ILTB_TESIS_TIPI. 或 TB_TESIS_TURU)一直为 null,那么您将收到 NullReferenceException。

    我的猜测是这些是表名,并且某些行没有与这些表对应的 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));
    

    【讨论】:

      【解决方案2】:

      你可能想试试 item.attr.IsNull()

      -我相信强制转换为字符串会导致它在 IsNullOrEmpty 测试之前将该项目标记为空。

      【讨论】:

        【解决方案3】:

        我没有使用实体框架。但是,当 SQL 查询没有返回任何行时,您可以枚举“sorgu”吗?

        要对此进行测试,您可以将 foreach 包装在 try/catch 中并捕获 NullReferenceException。有些人会使用这个 NullReferenceException 捕获来设置你正在做的事情,但我不推荐它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-28
          • 2015-02-16
          • 2015-02-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多