【问题标题】:Why empty cell throws an error during SQL stored procedure execution为什么空单元格在 SQL 存储过程执行期间会抛出错误
【发布时间】:2014-12-01 21:21:28
【问题描述】:
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>

【问题讨论】:

  • if (DBNull.Value == strValue)
  • 您能详细说明一下吗?
  • 如果 Eval("Specialty1") 为空,那么调用 ToString 可能会出现问题。尝试像 Eval("Specialty1") != null 之类的东西? Eval("Specialty").ToString() : ""
  • 剩下的呢?我正在使用+ 将它们全部添加以制作一个完整的列表。
  • Eval("Specialty1").ToString() == DBNull.Value) ? "" : Eval("Specialty1").ToString() + Eval("Specialty2").ToString() == DBNull.Value) ? "" : DisplayOffices(Eval("Specialty2").ToString()) + Eval("Specialty3").ToString() == DBNull.Value) ? "" : DisplayOffices(Eval("Specialty3").ToString()) + Eval("Specialty4").ToString() == DBNull.Value) ? "" : DisplayOffices(Eval("Specialty4").ToString()) + Eval("Specialty5").ToString() == DBNull.Value) ? "" : DisplayOffices(Eval("Specialty5").ToString()) + Eval("Specialty6").ToString() == DBNull.Value) ? "" : DisplayOffices(Eval("Specialty6").ToString())

标签: c# asp.net sql-server


【解决方案1】:

您可以在页面后面的代码中添加这样的内容:

protected object MyEval(string expression)
{
    object o = null;
    try
    {
        o = DataBinder.Eval(this.GetDataItem(), expression);
    }
    catch
    {
        o = System.String.Empty;
    }
    return o;
}

然后将所有 Eval 替换为“MyEval”:

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

【讨论】:

    【解决方案2】:

    如果您的问题是由 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 ...
    

    【讨论】:

    • 他提供的堆栈跟踪没有提到曾经进入那个函数。错误消息指出它在 Eval 调用上失败,因为它在数据集中找不到该列。
    • @Becuzz 没错。堆栈跟踪中提到的错误最可能的原因是属性名称拼写错误
    • @Becuzz 这就是为什么我以“万一你的问题......”这句话开始我的回答
    • 我其实和sql中的列同名
    【解决方案3】:

    正如 Gerbenny 在 cmets 中所说的那样。 DBNull 不会被 String.IsNullOrEmpty 拾取。 DBNull 的处理方式不同。用代码术语来表达。

    DBNull.Value != null
    

    所以基本上你需要在尝试显示或执行任何操作之前检查项目是否为 DBNull。

    基本上

        <%# Eval("Specialty1") != DBNull.Value ? Eval("Specialty1").ToString() : String.Empty + DisplayMultipleValues(Eval("Specialty2") != DBNull.Value ? Eval("Specialty2").ToString() : String.Empty)
     + etc... %>
    

    【讨论】:

    • 谢谢。我会测试一下。
    【解决方案4】:

    您提供的堆栈跟踪和错误消息准确说明了它不工作的原因。它说

    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 的列。这可能是由于拼写错误、未更新 proc 或其他一些原因。

    【讨论】:

    • 部分 sql 显示我这样做了,因此为什么我觉得收到此错误很奇怪。
    猜你喜欢
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2018-08-29
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多