このトピックでは、さまざまな型に関連付けられた null 値を処理する場合の予期される動作について説明し、null または特定のフィールドまたはメンバーの存在をチェックするためのオプションについて説明します。
XML
XML には次のことが適用されます。
XML 値は、ドキュメントから null として返されることはありません。 空の文字列または "存在しない" エラーです。 空の文字列の場合、ルールの作成時に整数型として指定されたフィールドなど、特定の型の変換でエラーが発生する可能性があります。
ビジネス ルール作成ツールでは、フィールドを null に設定したり、フィールドの型を オブジェクトに設定したりすることはできません。
オブジェクト モデルを使用して、型を Object に設定できます。 この場合、返される値は XPath が評価する 型 (XPath 式に応じて float、 boolean、または string) です。
.NET クラス
.NET クラスには、次のことが適用されます。
戻り値の型が オブジェクト 型でない場合、null と比較することはできません。
値型ではないパラメーターのパラメーターとして null を渡すことができますが、メンバーの実装によっては実行時エラーが発生する可能性があります。
Object から派生した型のフィールドを null に設定できます。
データ接続
データ接続には、次のことが適用されます。
テーブルで列に null が許可され、列の型が テキスト、 ntext、 およびイメージでない場合は、任意のデータベース テーブル列を null と比較できます。
注
ビジネス ルール作成ツールを使用すると、条件で型 テキスト および ntext の列を使用できます。 ただし、ポリシーを実行すると、"IS NULL または LIKE 演算子を使用する場合を除き、テキスト、ntext、および画像のデータ型を比較または並べ替えることはできません" というエラー メッセージが表示されます。
テーブルで列に 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 には、次のことが適用されます。
ビジネス ルール作成ツールは、DataConnectionと同じ方法でフィールドの種類をオブジェクトに変更します。
null 値と比較しない限り、null 値のテストは失敗します。 たとえば、アサートされた行に null 値がある場合、ルール "IF db.column > 5 THEN" にエラーが発生します。
条件は並列で評価されるため、"IF db.column != NULL AND db.column > 5 THEN" のようなテストは失敗します。これは、両方のテストがすべての行で評価される可能性があるためです。
null または存在を確認する
ビジネス ルールを記述するときは、値を比較する前にフィールドの存在を確認するのが自然です。 ただし、フィールドが null または存在しない場合、値を比較するとエラーが発生します。 次の規則があるとします。
製品/数量が存在する場合、かつ製品/数量 > 1
「製品」と「数量」のいずれかが存在しない場合、ルールでエラーがスローされます。 この問題を回避する方法の 1 つは、親ノードが存在する場合は要素値を返すヘルパー メソッドに渡すか、存在しない場合は別の値を返すことです。 次の規則を参照してください。
ルール 1
IF EXISTS(Product/Quantity) THEN ASSERT(CREATEOBJECT(typeof(Helper), Product/Quantity)
ルール 2
もし Helper.Value == X ならば...
もう 1 つの解決策は、次のようなルールを作成することです。
プロダクト/数量が存在する場合は、CheckQuantityAndDoSomething(プロダクト/数量)を実行する
前の例では、CheckQuantityAndDoSomething 関数によってパラメーター値がチェックされ、条件が満たされた場合に実行されます。
注
または、XML ファクトの XPath Field プロパティを変更してエラーをキャッチすることもできますが、推奨される方法ではありません。