早報(以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>
非常感謝您對我們的關注,到目前爲止!
問候
保羅
嗨米壽,感謝您的幫助,但如上所述,NULL和DBNull都會導致問題。乾杯,保羅/ –
你有沒有嘗試過一步一步的調試呢?什麼eaxctly rec.ParentID在你的菜單記錄?空或什麼?什麼是異常的類型名稱?我測試了一段代碼,用DBNull.Value填充所有的字段,它的工作原理! – mishau