Freigeben über


Behandeln von Null und DBNull

In diesem Thema wird das zu erwartende Verhalten beim Umgang mit Nullwerten beschrieben, die mit unterschiedlichen Typen verknüpft sind. Des Weiteren werden die Optionen zum Überprüfen auf NULL oder Vorhandensein für ein bestimmtes Feld oder einen bestimmten Member erläutert.

XML

Für XML gilt Folgendes:

  • Ein XML-Wert wird von einem Dokument nie mit NULL zurückgegeben. Der Wert enthält entweder eine leere Zeichenfolge oder eine Fehlermeldung des Typs "nicht vorhanden". Wenn der Wert eine leere Zeichenfolge enthält, tritt bei der Konvertierung bestimmter Typen, wie z. B. Felder, die beim Erstellen von Regeln als ganzzahliger Typ angegeben werden, möglicherweise ein Fehler auf.

  • Der Business Rule Composer ermöglicht es Ihnen nicht, ein Feld auf NULL festzulegen oder den Typ eines Felds auf -Objekt festzulegen.

  • Über das Objektmodell können Sie den Typ auf Object festlegen. In diesem Fall ist der zurückgegebene Wert der Typ, für den der XPath ausgewertet wird– float, boolean oder string, abhängig vom XPath-Ausdruck.

.NET-Klassen

Für .NET-Klassen gilt Folgendes:

  • Sie dürfen nicht mit NULL vergleichen, wenn Ihr Rückgabetyp kein Objekttyp ist.

  • NULL kann als Parameter übergeben werden, wenn es sich bei den Parametern nicht um Wertetypen handelt. Je nach Implementierung des Members kann dabei jedoch ein Laufzeitfehler auftreten.

  • Sie können Felder von Typen, die von Object abgeleitet werden, auf NULL festlegen.

Datenverbindung

Für Datenverbindungen gilt Folgendes:

  • Sie können jede Datenbanktabellenspalte mit NULL vergleichen, wenn die Tabelle NULL-Werte für die Spalte zulässt und der Spaltentyp nicht text, ntext und image ist.

    Hinweis

    Mit dem Business Rule Composer können Sie Spalten vom Typ, Text und ntext unter Bedingungen verwenden. Beim Ausführen der Richtlinie wird jedoch folgende Fehlermeldung angezeigt: "Die Datentypen 'text', 'ntext' und 'image' können nur mithilfe des Operators IS NULL oder LIKE verglichen oder sortiert werden".

  • Sie können jede Spalte einer Datenbanktabelle auf NULL festlegen, wenn in der Tabelle NULL als Spaltenwert zulässig ist.

  • Der Business Rule Composer legt den Membertyp in der Bindung automatisch auf -Objekt fest, wenn Sie für einen Werttyp vergleicht oder auf NULL festlegen. Es wird wieder auf den ursprünglichen Typ zurückgesetzt, wenn Sie das Argument zurücksetzen oder ersetzen.

  • Bei einem Zeichenfolgentyp ändert er den Typ in -Objekt , wenn Sie ihn auf NULL festlegen, belässt ihn jedoch als Zeichenfolge, wenn Sie mit NULL vergleichen.

  • Sie können dbNull.Value aus dem Business Rule Composer nicht vergleichen oder auf festlegen, da der Spaltentyp nicht in -Objekt geändert wird.

  • Beim Vergleich wird ein DBNull-Wert von der Engine zu NULL konvertiert, beim Einfügen in die Datenbank wird NULL in einen DBNull-Wert konvertiert.

  • Beim Testen werden Nullwerte ignoriert (Funktionsweise von SQL Server). Wenn Sie beispielsweise über die Regel "IF db.column > 5 THEN " verfügen, werden nur die Zeilen getestet, die einen Wert in db.column aufweisen– Zeilen mit NULL werden übersprungen.

'TypedDataTable' und 'TypedDataRow'

Für TypedDataTable und TypedDataRow gilt Folgendes:

  • Der Business Rule Composer ändert den Feldtyp in objekt auf die gleiche Weise wie bei DataConnections.

  • Tests schlagen bei Nullwerten fehl, es sei denn, es wird mit NULL verglichen. Beispielsweise tritt in der Regel "IF db.column > 5 THEN" ein Fehler auf, wenn jede behauptete Zeile einen NULL-Wert aufweist.

    Beachten Sie, dass tests wie "IF db.column != NULL AND db.column > 5 THEN" weiterhin fehlschlagen, da beide Tests potenziell für jede Zeile ausgewertet werden.

Überprüfen auf NULL oder Vorhandensein

Beim Erstellen von Geschäftsregeln ist es üblich, ein Feld auf Vorhandensein zu überprüfen, bevor der zugehörige Wert verglichen wird. Wenn ein Feld NULL enthält oder nicht vorhanden ist, tritt beim Vergleichen des Werts ein Fehler auf. Nehmen Sie folgende Regel als Beispiel:

WENN Produkt/Menge vorhanden ist UND Produkt/Menge > 1

Wenn Product/Quantity nicht vorhanden ist, wird bei Ausführung der Regel ein Fehler ausgelöst. Eine Möglichkeit zur Umgehung dieses Problems ist das Übergeben eines übergeordneten Knotens an eine Hilfsmethode, die den Wert des Elements zurückgibt, wenn es vorhanden ist, und einen anderen Wert, wenn es nicht vorhanden ist. Beachten Sie dazu die folgenden Regeln.

Regel 1

IF EXISTS(Product/Quantity) THEN ASSERT(CREATEOBJECT(typeof(Helper), Product/Quantity)

Regel 2

IF Helper.Value == X THEN...

Eine andere mögliche Lösung ist das Erstellen einer Regel wie der folgenden:

IF Product/Quantity Exist Then CheckQuantityAndDoSomething(Product/Quantity)

Im vorherigen Beispiel wird der Parameterwert von der Funktion CheckQuantityAndDoSomething überprüft. Wenn die Bedingung erfüllt ist, wird die Funktion ausgeführt.

Hinweis

Alternativ können Sie die XPath Field-Eigenschaft für den XML-Fakt ändern, um Alle Fehler abzufangen. Dies ist jedoch nicht der empfohlene Ansatz.