次の方法で共有


Null と DBNull を処理する方法

このトピックでは、さまざまな型に関連付けられた 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 プロパティを変更してエラーをキャッチすることもできますが、推奨される方法ではありません。