如何处理 Null 和 DBNull

本主题介绍处理与不同类型关联的 null 值时的预期行为,并讨论用于检查 null 或是否存在特定字段或成员的选项。

XML

以下内容适用于 XML:

  • XML 值永远不会从文档返回为 null。 它是空字符串或“不存在”错误。 当它是空字符串时,某些类型的转换可能会出现错误,例如,在生成规则时指定为整数类型的字段。

  • 业务规则编辑器不允许将字段设置为 null 或将字段的类型设置为 对象

  • 通过对象模型,可以将类型设置为 Object。 在这种情况下,返回的值是 XPath 计算的类型, 浮点数布尔值或 字符串,具体取决于 XPath 表达式。

.NET 类

以下内容适用于 .NET 类:

  • 如果返回类型不是 对象 类型,则不允许与 null 进行比较。

  • 可以将 null 作为非值类型的参数传递,但可能会收到运行时错误,具体取决于成员的实现。

  • 可以将派生自 Object 的类型字段设置为 null。

数据连接

以下内容适用于数据连接:

  • 如果表允许列的 null 值,并且列类型不是 文本ntext图像,则可以将任何数据库表列与 null 进行比较。

    注释

    业务规则编辑器允许在条件中使用类型为文本ntext的列。 但是,执行策略时,将收到一条错误消息,指出“文本、ntext 和图像数据类型不能进行比较或排序,除非使用 IS NULL 或 LIKE 运算符”。

  • 如果表允许该列的 null 值,则可以将任何数据库表列设置为 null。

  • 如果将值类型比较或设置为 null,业务规则编辑器会自动将绑定中的成员类型设置为 对象;如果重置或替换参数,它将更改回原始类型。

  • 对于字符串类型,如果将它设置为 null,它将类型更改为 对象 ,但如果与 null 进行比较,则将其保留为字符串。

  • 无法在业务规则编辑器中将 DBNull.Value 用于比较或设置,因为这样无法将列类型更改为 对象

  • 引擎将 DBNull 值转换为 null 进行比较,并将 null 转换为要插入到数据库的 DBNull 值。

  • 测试将忽略 null 值(这是 SQL Server 的工作方式)。 例如,如果你有规则“IF db.column > 5 THEN .”,则仅测试 db.column 中具有值的行 ,将跳过 null 的行。

TypedDataTable 和 TypedDataRow

以下内容适用于 TypedDataTable 和 TypedDataRow:

  • 业务规则编辑器以与 DataConnections 相同的方式将字段类型更改为对象

  • 除非与 null 值进行比较,否则测试将失败。 例如,如果断言的任何行具有 null 值,则规则“IF db.column > 5 THEN”中会出现错误。

    请注意,由于条件并行计算,因此“IF db.column != NULL AND db.column > 5 THEN”等测试仍将失败,因为两个测试都可能在每一行上进行评估。

检查是否为 null 或是否存在

编写业务规则时,在比较字段值之前,检查字段是否存在是自然的。 但是,如果字段为 null 或不存在,则比较该值将导致错误。 假设你有以下规则:

IF 产品/数量存在且产品/数量 > 1

如果产品/数量不存在,则会在规则中引发错误。 规避此问题的方法之一是将父节点传递给帮助程序方法,该方法在元素值存在时返回元素值,如果不存在,则返回其他元素值。 请参阅以下规则。

规则 1

如果存在(Product/Quantity),则断言(创建对象(typeof(Helper), Product/Quantity))

规则 2

如果 Helper.Value == X 那么...

另一种可能的解决方案是创建如下所示的规则:

若产品/数量存在,则检查数量并执行某操作(产品/数量)

在前面的示例中,CheckQuantityAndDoSomething 函数将检查参数值,并在满足条件时执行。

注释

或者,可以修改 XML 事实的 XPath Field 属性以捕获任何错误,但这不是建议的方法。