如何處理 Null 和 DBNull
本主題描述處理與不同型別關聯之 Null 值時的預期行為,並討論用來檢查特定欄位或成員是否為 Null 或是否存在的選項。
XML
以下說明適用於 XML:
XML 值絕對不會以 Null 從文件傳回。 這是空字串或「不存在」的錯誤。 若為空字串,即表示轉換特定型別時可能發生錯誤,例如在建立規則時將欄位指定為整數型別。
商務規則編輯器不允許您將欄位設定為 Null,或將欄位的類型設定為 物件。
透過物件模型,您可以將類型設定為 Object。 在此情況下,傳回的值是 XPath 評估的型別,視 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 比較,則會將其保留為字串。
您無法從商務規則編輯器比較或設定 為 DBNull.Value ,因為它不會將資料行類型變更為 物件。
此引擎會將 DBNull 值轉換為 Null 以進行比較,而且會將 Null 轉換為 DBNull 值以插入資料庫中。
測試會忽略 Null 值 (這是 SQL Server 的運作方式)。 例如,如果您有規則 「IF db.column > 5 THEN .」,則只會測試 db.column 中具有值的資料列,則會略過具有 Null 的資料列。
TypedDataTable 和 TypedDataRow
以下說明適用於 TypedDataTable 和 TypedDataRow:
商務規則編輯器會以與DataConnections 相同的方式,將欄位類型變更為物件。
除非您與 Null 比較,否則 Null 值的測試將會失敗。 例如,如果任何資料列判斷提示有 Null 值,則規則「IF db.column > 5 THEN」中會有錯誤。
請注意,由於條件會以平行方式進行評估,因此「IF db.column != Null AND db.column > 5 THEN」 等測試仍然會失敗,因為這兩項測試可能會在每一個資料列上進行評估。
檢查 Null 或存在狀況
編寫商務規則時,在比較欄位值之前檢查欄位是否存在是理所當然的。 不過,如果欄位是 Null 或不存在,比較值將會造成錯誤。 假設您有下列規則:
如果產品/數量存在,且產品/數量 > 1
如果 Product/Quantity 不存在,則會在規則中擲回錯誤。 避免這個問題的其中一種方式是將父節點傳遞給協助程式方法;如果項目值存在,協助程式方法就會傳回項目值,如果項目值不存在,則會傳回其他項目。 請參閱下列規則。
規則 1
IF EXISTS(Product/Quantity) THEN ASSERT(CREATEOBJECT(typeof(Helper), Product/Quantity)
規則 2
IF Helper.Value == X THEN...
另一種可能的解決方法是建立如下的規則:
IF Product/Quantity Exist Then CheckQuantityAndDoSomething(Product/Quantity)
在上述範例中,CheckQuantityAndDoSomething 函數會檢查參數值,並在符合條件時執行。
注意
或者,您可以修改 XML 事實的 XPath Field 屬性來攔截任何錯誤,但這不是建議的方法。