2011-09-11 30 views
4

早報(以RSA至少),將空到數據表

我試圖創建一個數據驅動的菜單,使用從自引用表中的數據來創建(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,然後在將其轉換爲XML之前創建一個DataRelation,以便在xmlDataSource中使用它,並將其轉換爲菜單的DataSource。

我必須承認我已經從這些論壇採取了很多代碼,並且它應該工作。除了轉換需要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到數據表,或者,做不到這一點,我如何才能在LINQ到實體來填充一個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> 

非常感謝您對我們的關注,到目前爲止!

問候

保羅

回答

0

可能是這樣? myDR [「ParentID」] = rec.ParentID == null? DBNull.Value:rec.ParentID;

+0

嗨米壽,感謝您的幫助,但如上所述,NULL和DBNull都會導致問題。乾杯,保羅/ –

+0

你有沒有嘗試過一步一步的調試呢?什麼eaxctly rec.ParentID在你的菜單記錄?空或什麼?什麼是異常的類型名稱?我測試了一段代碼,用DBNull.Value填充所有的字段,它的工作原理! – mishau

2

cntIuvo.MenuNavs的ParentID是否爲空?

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

謝謝_Fred_,但DBNull也不被接受進表中。我可能不得不求助於'原始'SQL來直接將數據存入DataTable。任何轉換似乎都會阻止空值。我可以;不填充原始表與Itegers,因爲我得到一個循環引用錯誤urng關係構建...但感謝您的幫助。 Paul –

+1

「ParentID」列可以爲空(DataColumn.AlllowDBNull爲true)嗎? –