Condividi tramite


Come gestire Null e DBNull

In questo argomento vengono descritti i comportamenti previsti quando si incontrano valori null associati a tipi differenti. Vengono inoltre descritte le opzioni per la verifica di valori null o dell'esistenza di un determinato campo o membro.

XML

Condizioni valide per i valori XML:

  • Un valore XML non verrà mai restituito da un documento come valore null. È sempre una stringa vuota o un errore di tipo "non esiste". Quando è una stringa vuota, è possibile che si verifichi un errore per la conversione di determinati tipi, ad esempio i campi specificati come tipo integer quando si creano delle regole.

  • Business Rule Composer non consente di impostare un campo su Null o di impostare il tipo di campo su oggetto .

  • Tramite il modello a oggetti è possibile impostare il tipo su Object. In questo caso, il valore restituito è il tipo a cui valuta XPath, float, boolean o stringa, a seconda dell'espressione XPath.

classi .NET

Condizioni valide per le classi .NET:

  • Non è consentito confrontare con Null se il tipo restituito non è un tipo di oggetto .

  • È possibile passare un parametro null per i parametri che non sono tipi di valore, ma è possibile che venga restituito un errore di runtime, a seconda dell'implementazione del membro.

  • È possibile impostare campi di tipi derivati da Object a Null.

Connessione dati

Condizioni valide per una connessione dati:

  • È possibile confrontare qualsiasi colonna della tabella di database con Null, se la tabella consente valori Null per la colonna e il tipo di colonna non è testo, ntext e immagine.

    Nota

    Business Rule Composer consente di usare colonne di tipo, testo e ntext, in condizioni. Quando si esegue il criterio viene tuttavia restituito il messaggio di errore "I tipi di dati text, ntext e image possono essere ordinati o confrontati esclusivamente quando si utilizza l'operatore IS NULL o LIKE".

  • È possibile impostare su null qualsiasi colonna di tabella del database, se la tabella consente l'utilizzo di valori null per la colonna.

  • Business Rule Composer imposta automaticamente il tipo membro nell'oggetto binding, se si confronta o si imposta su Null per un tipo di valore; viene modificato nuovamente nel tipo originale se si reimposta o si sostituisce l'argomento.

  • Per un tipo di stringa, modifica il tipo in oggetto se lo si imposta su Null, ma lo lascia come stringa se si confronta con Null.

  • Non è possibile confrontare o impostare su DBNull.Value da Business Rule Composer, perché non cambierà il tipo di colonna in oggetto.

  • Il motore convertirà in null un valore DBNull per il confronto e convertirà il valore null in un valore BDNull per l'inserimento nel database.

  • Nei test vengono ignorati i valori null (modalità di funzionamento di SQL). Ad esempio, se si dispone della regola "IF db.column 5 THEN", vengono testate solo le righe con valore in db.column > . Le righe con null vengono ignorate.

TypedDataTable e TypedDataRow

Condizioni valide per TypedDataTable e TypedDataRow:

  • Business Rule Composer modifica il tipo di campo in oggetto allo stesso modo di dataConnections.

  • In caso di valori null, a meno che non si esegua il confronto con valori null, i test avranno esito negativo. Ad esempio, si verifica un errore nella regola "IF db.column > 5 THEN", se una riga asserta ha un valore Null.

    Si noti che poiché le condizioni vengono valutate in parallelo, i test come "IF db.column != NULL AND db.column > 5 THEN " avranno comunque esito negativo, perché entrambi i test vengono potenzialmente valutati in ogni riga.

Verifica di valori null o dell'esistenza

Quando si scrivono regole di business è naturale verificare l'esistenza di un campo prima di confrontarne il valore. Se tuttavia il campo è null o non esiste, il confronto del valore determinerà un errore. Si supponga di utilizzare la regola seguente:

IF Product/Quantity Exists AND Product/Quantity > 1

Se Product/Quantity non esiste, nella regola verrà generato un errore. Uno dei modi per ovviare al problema consiste nel passare un nodo padre a un metodo di supporto che restituisce il valore dell'elemento, se disponibile, o qualche altro valore se questo non è disponibile. Vedere le regole seguenti:

Regola 1

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

Regola 2

IF Helper.Value == X THEN...

Un'altra soluzione possibile consiste nel creare una regola come la seguente:

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

Nell'esempio precedente la funzione CheckQuantityAndDoSomething verificherà il valore del parametro e, se la condizione viene soddisfatta, avvierà l'esecuzione.

Nota

In alternativa, è possibile modificare la proprietà XPath Field per il fatto XML per rilevare eventuali errori, ma non è l'approccio consigliato.