共用方式為


如何處理 Null 和 DBNull

本主題描述處理與不同類型相關聯之 Null 值時的預期行為,並討論檢查 Null 或特定欄位或成員是否存在的選項。

XML

下列適用於 XML:

  • XML 值永遠不會從檔傳回為 null。 它是空字串或「不存在」錯誤。 當它是空字串時,某些類型的轉換可能會發生錯誤,例如,建置規則時指定為整數類型的字段。

  • 商務規則撰寫工具不允許您將字段設定為 Null,或將字段的類型設定為 物件

  • 透過物件模型,您可以將類型設定為 Object。 在此情況下,視 XPath 運算式而定,傳回值的型別為 浮點數、布爾值字串

.NET 類別

下列適用於 .NET 類別:

  • 如果您的傳回類型不是 物件 類型,則不允許與 null 進行比較。

  • 您可以針對不是實值型別的參數傳遞 null 作為參數,但視成員的實作而定,您可能會收到運行時錯誤。

  • 您可以將衍生自 Object 的類型欄位設定為 null。

資料連線

下列適用於資料連線:

  • 如果資料表允許欄位為 null,且欄位類型不是 textntextimage,那麼您可以將任何資料庫資料表欄位與 null 進行比較。

    備註

    業務規則撰寫工具可讓您在條件中使用類型為 textntext 的數據行。 不過,當您執行原則時,會收到錯誤訊息,指出「除非使用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 屬性來攔截任何錯誤,但這不是建議的方法。