本主題描述處理與不同類型相關聯之 Null 值時的預期行為,並討論檢查 Null 或特定欄位或成員是否存在的選項。
XML
下列適用於 XML:
XML 值永遠不會從檔傳回為 null。 它是空字串或「不存在」錯誤。 當它是空字串時,某些類型的轉換可能會發生錯誤,例如,建置規則時指定為整數類型的字段。
商務規則撰寫工具不允許您將字段設定為 Null,或將字段的類型設定為 物件。
透過物件模型,您可以將類型設定為 Object。 在此情況下,視 XPath 運算式而定,傳回值的型別為 浮點數、布爾值或 字串。
.NET 類別
下列適用於 .NET 類別:
如果您的傳回類型不是 物件 類型,則不允許與 null 進行比較。
您可以針對不是實值型別的參數傳遞 null 作為參數,但視成員的實作而定,您可能會收到運行時錯誤。
您可以將衍生自 Object 的類型欄位設定為 null。
資料連線
下列適用於資料連線:
如果資料表允許欄位為 null,且欄位類型不是 text、ntext 或 image,那麼您可以將任何資料庫資料表欄位與 null 進行比較。
備註
業務規則撰寫工具可讓您在條件中使用類型為 text 和 ntext 的數據行。 不過,當您執行原則時,會收到錯誤訊息,指出「除非使用IS NULL或 LIKE 運算符,否則無法比較或排序 text、ntext 和 image 數據類型」。
您可以將任何資料庫資料表的欄位設定為 null,前提是該表允許欄位為 null。
如果您比較或將實值類型設定為 null,商務規則撰寫器會自動將繫結中的成員類型設定為物件;如果您重設或取代引數,它會變更回原始類型。
如果是字串類型,它會將類型變更為 物件 ,如果您將它設定為 null,但如果您與 null 比較,則會將其保留為字串。
您無法將 Business Rule Composer 中的 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” 如果有任何行的值為 Null,就會出現錯誤。
請注意,由於條件會以平行方式評估,因此「IF db.column != NULL AND db.column > 5 THEN」等測試仍然會失敗,因為兩個測試可能會在每一個數據列上進行評估。
檢查 Null 或是否存在
撰寫商務規則時,在比較字段值之前,先檢查字段是否存在是自然的。 不過,如果欄位為 Null 或不存在,則比較值會造成錯誤。 假設您有下列規則:
如果產品/數量存在 AND 產品/數量 > 1
如果 Product/Quantity 不存在,則會在規則中拋出錯誤。 規避此問題的其中一種方法是將父節點傳遞至輔助方法,該方法會在元素存在時返回元素的值,若不存在則返回其他值。 請參閱下列規則。
規則 1
若存在(Product/Quantity) 則斷言(CREATEOBJECT(typeof(Helper), Product/Quantity))
規則 2
如果 Helper.Value == X 那麼...
另一個可能的解決方案是建立如下的規則:
判斷 Product/Quantity 是否存在,如果存在,則執行 CheckQuantityAndDoSomething(Product/Quantity)
在上述範例中,CheckQuantityAndDoSomething 函式會檢查參數值,並在符合條件時執行。
備註
或者,您可以修改 XML 事實的 XPath Field 屬性來攔截任何錯誤,但這不是建議的方法。