为什么空单元格在SQL存储过程执行期间抛出错误

时间:2014-12-01 21:21:29

标签: c# asp.net sql-server

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>

4 个答案:

答案 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>