【问题标题】:RDLC report doesn't detect NULL values correctlyRDLC 报告未正确检测 NULL 值
【发布时间】:2013-01-11 10:56:18
【问题描述】:

我在生成 .rdlc 报告时遇到问题。其中一列具有以下表达式:

IIF(CInt(Fields!MyColumn.Value) = 0 or Fields!MyColumn.Value is nothing,"Unknown",Fields!MyColumn.Value)

我也尝试过将该字段用作字符串:

=IIF(IsNothing(Fields!MyColumn.Value) or Fields!MyColumn.Value is nothing,"Unknown",Fields!MyColumn.Value.ToString())

当 MyColumn 的值不是NULL 时,报表正确显示该值,但当它是NULL(或转换为int 类型时为0)时,报表返回#Error。奇怪的是,当我删除 if 函数并仅显示该字段的值时,报告显示 0 或空白(它不返回错误)。 我该如何解决这个问题?

【问题讨论】:

    标签: c# reporting rdlc


    【解决方案1】:

    您可以尝试在不进行比较的情况下进行验证:

    =IIf(Fields!YourColumn.Value
        , Fields!YourColumn.Value
        , "Unknown")
    

    或者撤销你的检查(检查它是否存在,而不是检查它是否不存在):

    =IIf(Fields!YourColumn.Value > 0
        , Fields!YourColumn.Value
        , "Unknown")
    

    另外,我不确定,但这可能与在同一列中使用不同的值类型有关。尝试对整个列使用相同的值类型。比如只输出字符串,或者只输出整数。

    如果没有任何效果,您还可以检查代码中的 NULL 值,然后将值设置为 0 或 -1(或左右)。然后在你的 RDLC 报告中你可以检查一下。

    【讨论】:

    • 我已经尝试过这种方法,但我仍然得到错误。我试图获取该列的类型 - 当有值时类型是 System.String 但当值为 null 时它返回 #Error
    • 您可以尝试将 String.Format 添加到 false 和 true 输出吗? =IIf(Fields!YourColumn.Value , String.Format("{0}", Fields!YourColumn.Value) , String.Format("{0}", "Unknown") 或者,您可以在代码中运行 NULL 检查并将值设置为 0 或 -1 如果是这样,然后检查。
    • String.Format 也不起作用。有没有办法告诉 rdlc 在出现错误时显示什么?普通代码中的 try-catch 之类的东西
    • 嘿,我设法通过更改DataTable中的数据来解决它。您能否将其发布为答案,以便我将其标记为正确。
    • 您能详细说明一下吗?您检查了代码中的 NULL,然后将值更改为 0(或左右)并检查了吗?
    【解决方案2】:

    我认为你必须先检查你的字段是否为空,否则你会在比较中得到错误(NULL大于0?->错误!)

    所以你的公式必须是:

    =IIF(IsNothing(Fields!MyColumn.Value) or CInt(Fields!MyColumn.Value) = 0,"Unknown",Fields!MyColumn.Value)
    

    我也会尝试 Switch 功能:

    =Switch(
        IsNothing(Fields!MyColumn.Value), "Unknown", 
        Fields!MyColumn.Value = 0, "Unknown", 
        Fields!MyColumn.Value > 0, Fields!MyColumn.Value, 
        )
    

    另外,如果您的字段已经是一个数字,则不必使用 CInt(""),否则公式将为:

    =Switch(
        IsNothing(Fields!MyColumn.Value), "Unknown", 
        CInt(Fields!MyColumn.Value) = 0, "Unknown", 
        CInt(Fields!MyColumn.Value) > 0, Fields!MyColumn.Value, 
        )
    

    【讨论】:

    • 我试过开关功能,没用。 IsNothing 也不起作用,我已经尝试按长度 (Len(Fields!MyColumn.Value)=0) 但我仍然得到#Error。
    • VS 版本?顺便说一句,您也可以使用is nothing,但您必须在与 int 进行比较之前检查一下!!
    【解决方案3】:

    根据@Deruijter 回答下的cmets,如果表达式if (dr.ItemArray.GetValue(15).ToString() == "") 对您有效且没有错误,那么您的字符串不是NULL;您的数据集中只有空(即零长度)字符串。在这种情况下,在 RDLC 表达式中,您将使用 Len 而不是 IsNothingIs NothingCInt 技巧。

    如果值是真实的NULL,则单个IsNothing 检查就足够了。

    还要记住,Or 在使用 VB .NET 的 RDLC 表达式中 does NOT short-circuit; VB .NET 中与 C# 或 C 类似的等效短路 or 运算符是 OrElse 运算符。 (不过,这似乎对您没有影响)。

    【讨论】:

      【解决方案4】:

      你可以直接去设计师那里设置:

      this.column.AllowDBNull = true;
      

      【讨论】:

      • 为什么会有帮助?
      猜你喜欢
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多