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.