Supporto dei valori Null e confronti di logica a tre valori

Se si ha familiarità con i tipi di dati di SQL Server, è possibile notare la somiglianza nella semantica e nella precisione dello spazio dei nomi System.Data.SqlTypes in .NET Framework. Esistono tuttavia alcune differenze, le più importanti delle quali sono illustrate nel presente argomento.

Valori NULL

Una differenza importante tra i tipi di dati Common Language Runtime (CLR) nativi e i tipi di dati di SQL Server consiste nel fatto che i primi non consentono valori NULL, mentre i secondi forniscono semantica NULL completa.

La presenza di valori NULL influisce sui confronti. Quando si confrontano due valori x e y, se x o y è NULL, alcuni confronti logici restituiscono un valore UNKNOWN anziché True o False.

Tipo di dati SqlBoolean

Lo spazio dei nomi System.Data.SqlTypes introduce un tipo SqlBoolean per rappresentare questa logica a 3 valori. I confronti tra gli spazi dei nomi SqlTypes restituiscono un tipo di valore SqlBoolean. Il valore UNKNOWN viene rappresentato dal valore Null del tipo SqlBoolean. Vengono fornite le proprietà IsTrue, IsFalse e IsNull per controllare il valore di un tipo SqlBoolean.

Operazioni, funzioni e valori NULL

Tutti gli operatori aritmetici (+, -, *, /,%), gli operatori bit per bit (~, &e |) e la maggior parte delle funzioni restituiscono NULL se alcuni degli operandi o degli argomenti di SqlTypes sono NULL. La proprietà IsNull restituisce sempre un valore True o False.

Precisione

I valori massimi dei tipi di dati decimali CLR di .NET Framework sono diversi da quelli dei tipi di dati numerici e decimali di SQL Server. Per i tipi di dati CLR decimali di .NET Framework, inoltre, si presuppone la massima precisione. Nei tipi di dati CLR per SQL Server, tuttavia, SqlDecimal fornisce la stessa scala e precisione massima e la stessa semantica del tipo di dati decimali di SQL Server.

Rilevamento dell'overflow

Nei tipi di dati CLR di .NET Framework è possibile che l'aggiunta di due numeri molto grandi non generi un'eccezione. Se invece non è stato utilizzato alcun operatore di controllo, il risultato restituito potrebbe essere un numero intero negativo. In System.Data.SqlTypes vengono generate eccezioni per tutti gli errori di overflow e underflow e per gli errori dovuti alla divisione per zero.