将NULL插入DataTable

4
早上好(至少在南非),我正在尝试创建一个数据驱动的菜单,使用自引用表中的数据来创建一个(两级)分层结构。示例数据如下:
MenuID  ParentID  Text      Url      CSS
1       Null      Top                topCSS
2       Null      Second             secCSS
3       1         abc       z.aspx   abcCSS
4       1         def       y.aspx   abcCSS
5       2         ghi       x.aspx   defCSS

我正在使用LINQ to Entities获取这些数据。然后我填充一个DataTable,再填充一个DataSet,创建DataRelation,最后将其转换为XML格式以便在xmlDataSource中使用并进行转换以用作菜单的数据源。
我必须承认,我从这些论坛中借鉴了很多代码,它们应该可以工作。但是转换需要在ParentID中插入NULL值来表示顶级菜单项,但我无法将NULL插入到DataTable中。下面是代码:
        using (var cntIuvo = new iuvocexi_dbEnts())
        {
            var b = (from a in cntIuvo.MenuNavs select a);
            DataTable myTB = new DataTable();
            myTB.Columns.Add("MenuID");
            myTB.Columns.Add("ParentID");
            myTB.Columns.Add("url");
            myTB.Columns.Add("CSS");
            DataRow myDR;

            foreach (var rec in b)
            {
                myDR = myTB.NewRow();
                myDR["MenuID"] = rec.MenuID;
                myDR["ParentID"] = rec.ParentID;  // error is generated here
                myDR["url"] = rec.url;
                myDR["CSS"] = rec.CSS;
                myTB.Rows.Add(myDR);
            }

            DataSet ds = new DataSet(); 
            ds.Tables.Add(myTB);
            ds.DataSetName = "Menus";
            ds.Tables[0].TableName = "Menu";
            DataRelation relation = new DataRelation("ParentChild", ds.Tables["Menu"].Columns["MenuID"], ds.Tables["Menu"].Columns["ParentID"], true);
            relation.Nested = true;
            ds.Relations.Add(relation);
            xmlDataSource1.Data = ds.GetXml();
            if (Request.Params["Sel"] != null)
                Page.Controls.Add(new System.Web.UI.LiteralControl("You selected " +
                  Request.Params["Sel"]));
        }

我的问题是:如何将NULL插入DataTable中?如果无法实现,应该如何让LINQ to Entities填充一个DataTable/DataSet呢?如果还不行,该如何设置转换以允许使用0代替NULL。
下面是Transform.xslt:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" encoding="utf-8"/>

  <!-- Replace root node name Menus with MenuItems
   and call MenuListing for its children-->
  <xsl:template match="/Menus">
    <MenuItems>
      <xsl:call-template name= "MenuListing" />
    </MenuItems>
  </xsl:template>

  <!-- Allow for recursive child nodeprocessing -->
  <xsl:template name="MenuListing">
    <xsl:apply-templates select ="Menu" />
  </xsl:template>

  <xsl:template match="Menu">
    <MenuItem>
      <!-- Convert Menu child elements to MenuItem attributes -->
      <xsl:attribute name="Text">
        <xsl:value-of select="Text"/>
      </xsl:attribute>
      <xsl:attribute name="ToolTip">
        <xsl:value-of select="Text"/>
      </xsl:attribute>
      <xsl:attribute name="NavigateUrl">
        <xsl:text>?Sel=</xsl:text>
        <xsl:value-of select = "url"/>
      </xsl:attribute>

      <!-- Recursively call MenuListing forchild menu nodes -->
       <xsl:if test="count(Menu) >0">
         <xsl:call-template name="MenuListing" />
       </xsl:if>
    </MenuItem>
  </xsl:template>
</xsl:stylesheet>

非常感谢您迄今为止的关注!
敬礼,
保罗
2个回答

2
父级菜单ID (ParentID) 是否可为空?
myDR["ParentID"] = rec.ParentID ?? Convert.DBNull; // Replace null value to DBNull

谢谢_Fred_,但DBNull也不能被接受到表中。我可能不得不诉诸于“原始”的SQL直接将数据放入DataTable中。任何转换似乎都会在遇到Null时停止。我无法使用整数填充原始表格,因为在关系构建时会出现循环引用错误...但还是感谢你的帮助。Paul - Paul Innes
1
“ParentID”列是否可为空(DataColumn.AllowDBNull为true)? - Viacheslav Ivanov

0

可能是这样的吗? myDR["ParentID"] = rec.ParentID == null ? DBNull.Value : rec.ParentID;


嗨,mishou,感谢您的帮助,但正如上文所述,Null和DBNull都会引起问题。祝好,保罗/ - Paul Innes
你尝试过逐步调试吗?你的菜单记录中rec.ParentID到底是什么?是空值还是其他东西?异常类型名称是什么?我测试了你的代码片段,用DBNull.Value填充所有字段,它正常工作! - mishau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接