Null と DBNull を処理する方法
このトピックでは、さまざまな型に関連する Null 値が処理されるときの予期される動作、および特定のフィールドまたはメンバーについて Null または存在の有無をチェックするためのオプションについて説明します。
XML
次の説明は XML に関係します。
ドキュメントから XML 値が Null として返されることはありません。 これは空の文字列または "存在しない" エラーのいずれかです。 空の文字列の場合は、特定の型 (たとえばルール作成時に整数型として指定されたフィールド) の変換でエラーが発生する場合があります。
ビジネス ルール作成ツールでは、フィールドを null に設定したり、フィールドの型を object に設定したりすることはできません。
オブジェクト モデルを使用して、型を Object に設定できます。 この場合、返される値は XPath 式に応じて、XPath が評価する型 ( float、 boolean、 または string) です。
.NET クラス
次の説明は .NET クラスに関係します。
戻り値の型が オブジェクト 型でない場合、null と比較することはできません。
値の型以外のパラメーターには Null をパラメーターとして渡せますが、メンバーの実装によっては実行時エラーが発生する場合があります。
Object から派生した型のフィールドを null に設定できます。
データ接続
次の説明はデータ接続に関係します。
テーブルで列の null が許可され、列の種類が text、 ntext、 image でない場合は、任意のデータベース テーブル列を null と比較できます。
Note
ビジネス ルール作成ツールを使用すると、条件で型、 テキスト 、 および ntext の列を使用できます。 ただし、そのポリシーを実行すると、"IS NULL または LIKE 演算子を使用している場合を除き、テキスト、ntext、および画像のデータ型の比較や並べ替えはできません" というエラー メッセージが表示されます。
データベース テーブルの列に対してテーブルで Null が許可されている場合は、その列を Null に設定できます。
値型を比較または null に設定した場合、ビジネス ルール Composer はバインド内のメンバー型を オブジェクトに自動的に設定します。引数をリセットまたは置換すると、元の型に戻ります。
文字列型の場合、null に設定すると型は object に変更されますが、null と比較すると文字列として残ります。
列の種類が object に変更されないため、ビジネス ルール作成ツールから DBNull.Value を比較または設定することはできません。
エンジンでは、比較の際に DBNull 値が Null に変換され、データベースに挿入する際に Null が DBNull 値に変換されます。
テストでは Null 値が無視されます (SQL Server の動作)。 たとえば、"IF db.column > 5 THEN." という規則がある場合、db.column の値を持つ行のみがテストされます。null の行はスキップされます。
TypedDataTable および TypedDataRow
次の説明は TypedDataTable および TypedDataRow に関係します。
ビジネス ルール作成ツールは、DataConnectionと同じ方法でフィールドの種類を object に変更します。
Null と比較する場合を除いて、Null 値があるとテストは失敗します。 たとえば、アサートされた行に null 値がある場合、ルール "IF db.column > 5 THEN" にエラーが発生します。
条件は並列で評価されるため、両方のテストがすべての行で評価される可能性があるため、"IF db.column != NULL AND db.column > 5 THEN" のようなテストは失敗します。
Null または存在の有無のチェック
ビジネス ルールを作成するときには、通常、フィールドの値を比較する前にそのフィールドの存在を確認します。 ただし、フィールドが Null かまたは存在しない場合に値を比較すると、エラーが発生します。 たとえば、次のルールがあるとします。
IF 製品/数量が存在し、製品/数量 > 1
Product/Quantity が存在しない場合は、ルールでエラーがスローされます。 この問題を回避する 1 つの方法として、要素の値が存在する場合にその値を返し、存在しない場合は別のものを返すヘルパー メソッドに親ノードを渡します。 次のルールを見てください。
規則 1
IF EXISTS(Product/Quantity) THEN ASSERT(CREATEOBJECT(typeof(Helper), Product/Quantity)
規則 2
IF Helper.Value == X THEN...
もう 1 つの解決方法として考えられるのは、次のようなルールを作成することです。
IF Product/Quantity Exist Then CheckQuantityAndDoSomething(Product/Quantity)
この例では、CheckQuantityAndDoSomething 関数がパラメーター値をチェックし、条件が満たされていれば処理を実行します。
Note
または、XML ファクトの XPath Field プロパティを変更してエラーをキャッチすることもできますが、推奨される方法ではありません。