SELECT
CAST ([content_html] AS XML).query('/root/Physicians/specialty/a') AS [Specialty1]
, CAST ([content_html] AS XML).query('/root/Physicians/specialty2/a') AS [Specialty2]
, CAST ([content_html] AS XML).query('/root/Physicians/specialty3/a') AS [Specialty3]
, CAST ([content_html] AS XML).query('/root/Physicians/specialty4/a') AS [Specialty4]
, CAST ([content_html] AS XML).query('/root/Physicians/specialty5/a') AS [Specialty5]
, CAST ([content_html] AS XML).query('/root/Physicians/specialty6/a') AS [Specialty6]
FROM
[db].[dbo].[content]
WHERE
[folder_id] = '188'
AND
(content_status = 'A')
ORDER BY
[content_title]
ASP.net转发器(部分):
<asp:Label ID="lblSpec1" runat="server"><%# Eval("Specialty1").ToString() + DisplayMultipleValues(Eval("Specialty2").ToString()) + DisplayMultipleValues(Eval("Specialty3").ToString()) + DisplayMultipleValues(Eval("Specialty4").ToString()) + DisplayMultipleValues(Eval("Specialty5").ToString()) + DisplayMultipleValues(Eval("Specialty6").ToString()) %></asp:Label>
C#(处理多个条目并添加,
的代码):
public string DisplayMultipleValues(string strValue)
{
return (NonBlankValueOf(strValue));
}
public string NonBlankValueOf(string source)
{
return (string.IsNullOrEmpty(source)) ? "" : ", " + source;
}
当我在SQL中运行查询时它工作正常(如果列没有值,那么它是一个空单元格)但是通过代码后面运行它会给我以下错误:
Server Error in '/' Application.
DataBinding: 'System.Data.DataRowView' does not contain a property with the name 'Specialty3'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Web.HttpException: DataBinding: 'System.Data.DataRowView' does not contain a property with the name 'Specialty3'.
Source Error:
Line 96: </div>
Line 97: <div class="optionRight">
Line 98: <asp:Label ID="lblSpec1" runat="server"><%# Eval("Specialty1").ToString() + DisplayMultipleValues(Eval("Specialty2").ToString()) + DisplayMultipleValues(Eval("Specialty3").ToString()) + DisplayMultipleValues(Eval("Specialty4").ToString()) + DisplayMultipleValues(Eval("Specialty5").ToString()) + DisplayMultipleValues(Eval("Specialty6").ToString()) %></asp:Label>
Line 99: </div>
Line 100: </div>
Source File: c:\er.aspx Line: 98
Stack Trace:
[HttpException (0x80004005): DataBinding: 'System.Data.DataRowView' does not contain a property with the name 'Specialty3'.]
System.Web.UI.DataBinder.GetPropertyValue(Object container, String propName) +12523742
System.Web.UI.DataBinder.Eval(Object container, String[] expressionParts) +142
ASP.find_provider_aspx.__DataBind__control22(Object sender, EventArgs e) in c:\er.aspx:98
System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +304
System.Web.UI.Control.DataBindChildren() +12746711
System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +321
System.Web.UI.Control.DataBindChildren() +12746711
System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +321
System.Web.UI.WebControls.Repeater.CreateItem(Int32 itemIndex, ListItemType itemType, Boolean dataBind, Object dataItem) +183
System.Web.UI.WebControls.Repeater.CreateControlHierarchy(Boolean useDataSource) +659
System.Web.UI.WebControls.Repeater.OnDataBinding(EventArgs e) +164
find_provider.Search() in c:\er.aspx.cs:294
find_provider.Page_Load(Object sender, EventArgs e) in c:\er.aspx.cs:37
System.Web.UI.Control.LoadRecursive() +71
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3178
解决问题的最佳方法是什么?
我尝试了以下内容:
<asp:Label ID="lblspec1" runat="server"><%# If(Eval("Specialty1").ToString() Is DBNull.Value, "", Eval("Specialty1").ToString()) + If(Eval("Specialty2").ToString() Is DBNull.Value, "", DisplayOffices(Eval("Specialty2").ToString())) + If(Eval("Specialty3").ToString() Is DBNull.Value, "", DisplayOffices(Eval("Specialty3").ToString())) + If(Eval("Specialty4").ToString() Is DBNull.Value, "", DisplayOffices(Eval("Specialty4").ToString())) + If(Eval("Specialty5").ToString() Is DBNull.Value, "", DisplayOffices(Eval("Specialty5").ToString())) + If(Eval("Specialty6").ToString() Is DBNull.Value, "", DisplayOffices(Eval("Specialty6").ToString())) %></asp:Label>
答案 0 :(得分:1)
如果您的问题是由NULL值引起的,那么您可以通过以下方式解决问题:
public string DisplayMultipleValues(object strValue)
{
if (strValue == null)
return "";
else
return (NonBlankValueOf(strValue.ToString()));
}
您的Eval语句应如下所示:
<%# Eval("Specialty1") == null ? "" : Eval("Specialty1").ToString() +
DisplayMultipleValues(Eval("Specialty2")) + etc ...
答案 1 :(得分:1)
Gerbenny在评论中说。 String.IsNullOrEmpty不会获取DBNull。 DBNull的处理方式不同。把它放在代码中。
DBNull.Value != null
所以基本上你需要在尝试显示或执行任何操作之前检查一个Item是否为DBNull。
基本上
<%# Eval("Specialty1") != DBNull.Value ? Eval("Specialty1").ToString() : String.Empty + DisplayMultipleValues(Eval("Specialty2") != DBNull.Value ? Eval("Specialty2").ToString() : String.Empty)
+ etc... %>
答案 2 :(得分:1)
您提供的堆栈跟踪和错误消息说明了它无法正常工作的原因。它说
DataBinding: 'System.Data.DataRowView' does not contain a property with the name 'Specialty3'.
来自
...
System.Web.UI.DataBinder.Eval(Object container, String[] expressionParts) +142
...
这意味着您正在执行Eval("Specialty3")
的错误。
所有这些归结为从数据库返回的数据集不包含名为Specialty3的列。它可能来自拼写错误,不会更新过程或出于其他一些原因。
答案 3 :(得分:1)
您可以将以下内容添加到页面后面的代码中:
protected object MyEval(string expression)
{
object o = null;
try
{
o = DataBinder.Eval(this.GetDataItem(), expression);
}
catch
{
o = System.String.Empty;
}
return o;
}
然后用&#34; MyEval&#34;:
替换所有的Evals<asp:Label ID="lblSpec1" runat="server"><%# MyEval("Specialty1").ToString() + DisplayMultiplMyEvalues(MyEval("Specialty2").ToString()) + DisplayMultiplMyEvalues(MyEval("Specialty3").ToString()) + DisplayMultiplMyEvalues(MyEval("Specialty4").ToString()) + DisplayMultiplMyEvalues(MyEval("Specialty5").ToString()) + DisplayMultiplMyEvalues(MyEval("Specialty6").ToString()) %></asp:Label>