将 NULL 插入数据表

问题描述 投票:0回答:2

我正在尝试创建一个数据驱动的菜单,使用自引用表中的数据来创建(2 级)层次结构。示例数据是:

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 中使用,在 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>
c# asp.net linq-to-entities datatable datarelation
2个回答
2
投票

cntIuvo.MenuNavs 的 ParentID 可以为空吗?

myDR["ParentID"] = rec.ParentID ?? Convert.DBNull; // Replace null value to DBNull

0
投票

也许像这样?

myDR["ParentID"] = rec.ParentID == null ?  DBNull.Value : rec.ParentID; 
© www.soinside.com 2019 - 2024. All rights reserved.