本主题介绍处理与不同类型关联的 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 属性以捕获任何错误,但这不是建议的方法。