Null Değerleri İşleme
İlişkisel veritabanındaki null değer, sütundaki değer bilinmediğinde veya eksik olduğunda kullanılır. Null, boş bir dize (karakter veya tarih saat veri türleri için) veya sıfır değeri (sayısal veri türleri için) değildir. ANSI SQL-92 belirtimi, tüm null değerlerin tutarlı bir şekilde işlenmesi için null değerin tüm veri türleri için aynı olması gerektiğini belirtir. Ad System.Data.SqlTypes alanı, arabirimini uygulayarak INullable null semantik sağlar. içindeki System.Data.SqlTypes veri türlerinin her biri kendi IsNull
özelliğine ve Null
bu veri türünün bir örneğine atanabilecek bir değere sahiptir.
Not
.NET Framework sürüm 2.0, programcıların temel alınan türdeki tüm değerleri temsil eden bir değer türünü genişletmesine olanak tanıyan null atanabilir değer türleri için destek sunms. Bu CLR null atanabilir değer türleri, yapının bir örneğini Nullable temsil edilir. Bu özellik özellikle değer türleri kutulandığında ve kutulanmadığında kullanışlıdır ve nesne türleriyle gelişmiş uyumluluk sağlar. BIR ANSI SQL null değeri başvuruyla aynı şekilde null
davranmadığından (veya Nothing
Visual Basic'te) CLR null atanabilir değer türleri veritabanı null değerlerini depolamak için tasarlanmamıştır. Veritabanı ANSI SQL null değerleriyle çalışmak için yerine null değerleri NullablekullanınSystem.Data.SqlTypes. Visual Basic'te boş değer atanabilir CLR değeri türleriyle çalışma hakkında daha fazla bilgi için bkz . Null Atanabilir Değer Türleri ve C# için bkz . Null atanabilir değer türleri.
Null'lar ve Üç Değerli Mantık
Sütun tanımlarında null değerlere izin vermek, uygulamanıza üç değerli mantık ekler. Karşılaştırma üç koşuldan birini değerlendirebilir:
Doğru
Yanlış
Bilinmiyor
Null değerinin bilinmediği kabul edildiğinden, birbirine kıyasla iki null değeri eşit olarak kabul edilmez. Aritmetik işleçler kullanan ifadelerde işlenenlerden herhangi biri null ise sonuç da null olur.
Nulls ve SqlBoolean
Herhangi biri System.Data.SqlTypes arasındaki karşılaştırma bir SqlBooleandöndürür. Her SqlType
birinin IsNull
işlevi bir SqlBoolean döndürür ve null değerleri denetlemek için kullanılabilir. Aşağıdaki doğruluk tabloları VE, OR ve DEĞİl işleçlerinin null değer varlığında nasıl çalıştığını gösterir. (T=true, F=false ve U=unknown veya null.)
ANSI_NULLS Seçeneğini Anlama
System.Data.SqlTypes , SQL Server'da ANSI_NULLS seçeneğinin açık olduğu zaman ile aynı semantiği sağlar. tüm aritmetik işleçler (+, -, *, /, %), bit düzeyinde işleçler (~, &, |) ve çoğu işlev, işlenenlerden veya bağımsız değişkenlerden herhangi biri null olduğunda null döndürür, özelliği IsNull
dışında.
ANSI SQL-92 standardı, WHERE yan tümcesinde columnName = NULL değerini desteklemez. SQL Server'da ANSI_NULLS seçeneği hem veritabanında varsayılan null atanabilirliği hem de null değerlerle karşılaştırmaların değerlendirilmesini denetler. ANSI_NULLS açıksa (varsayılan), IS NULL işleci null değerleri test ederken ifadelerde kullanılmalıdır. Örneğin, ANSI_NULLS açık olduğunda aşağıdaki karşılaştırma her zaman bilinmeyen sonuç verir:
colname > NULL
Null değer içeren bir değişkenin karşılaştırılması da bilinmeyen sonuçlar verir:
colname > @MyVariable
Bir null değeri test etmek için IS NULL veya IS NOT NULL koşulunu kullanın. Bu, WHERE yan tümcesine karmaşıklık ekleyebilir. Örneğin, AdventureWorks Customer tablosundaki TerritoryID sütunu null değerlere izin verir. SELECT deyimi, diğerlerine ek olarak null değerleri test etmek için bir IS NULL koşulu içermelidir:
SELECT CustomerID, AccountNumber, TerritoryID
FROM AdventureWorks.Sales.Customer
WHERE TerritoryID IN (1, 2, 3)
OR TerritoryID IS NULL
SQL Server'da ANSI_NULLS kapalı olarak ayarlarsanız, null ile karşılaştırmak için eşitlik işlecini kullanan ifadeler oluşturabilirsiniz. Ancak, farklı bağlantıların bu bağlantı için null seçenekler ayarlamasını önleyemezsiniz. Bağlantının ANSI_NULLS ayarlarından bağımsız olarak, null değerleri test etmek için IS NULL kullanmak her zaman işe yarar.
ANSI_NULLS kapalı ayarı, içinde null değerleri işlemek için her zaman ANSI SQL-92 standardını izleyen bir DataSet
içinde System.Data.SqlTypesdesteklenmez.
Null Değerler Atama
Null değerler özeldir ve bunların depolama ve atama semantiği farklı tür sistemleri ve depolama sistemleri arasında farklılık gösterir. A Dataset
, farklı tür ve depolama sistemleriyle kullanılacak şekilde tasarlanmıştır.
Bu bölümde, farklı tür sistemleri genelinde içindeki 'ye DataColumn DataRow null değerler atamak için null semantiği açıklanmaktadır.
DBNull.Value
Bu atama herhangi bir DataColumn
tür için geçerlidir. türü uygularsaINullable
DBNull.Value
, uygun kesin olarak yazılan Null değere zorlamalı olur.
SqlType.Null
Tüm System.Data.SqlTypes veri türleri uygular INullable
. Kesin olarak yazılan null değer, örtük atama işleçleri kullanılarak sütunun veri türüne dönüştürülebiliyorsa atamanın geçmesi gerekir. Aksi takdirde geçersiz bir atama özel durumu oluşturulur.
null
'null' verilen DataColumn
veri türü için yasal bir değerse, uygun DbNull.Value
veya Null
türüyle INullable
ilişkili (SqlType.Null
) içine alınır
derivedUdt.Null
UDT sütunları için null değerler her zaman ile DataColumn
ilişkilendirilmiş türe göre depolanır. Alt sınıfı uygulanırken uygulanmayan INullable
ile ilişkili bir DataColumn
UDT örneğini göz önünde bulundurun. Bu durumda, türetilmiş sınıfla ilişkili kesin olarak yazılmış bir null değer atanırsa, null depolama her zaman DataColumn'un veri türüyle tutarlı olduğundan, yazılmamış DbNull.Value
olarak depolanır.
Not
Nullable<T>
veya Nullable yapısı şu anda içinde DataSet
desteklenmiyor.
Herhangi bir System.Data.SqlTypes örneğin varsayılan değeri null'tır.
içindeki System.Data.SqlTypes null değerler türe özgü olup gibi DbNull
tek bir değerle temsil edilemez. IsNull
Null değerleri denetlemek için özelliğini kullanın.
Null değerler, aşağıdaki kod örneğinde gösterildiği gibi öğesine DataColumn atanabilir. Özel durum tetiklemeden değişkenlere SqlTypes
doğrudan null değerler atayabilirsiniz.
Örnek
Aşağıdaki kod örneği, ve SqlStringolarak SqlInt32 tanımlanan iki sütun içeren bir DataTable oluşturur. Kod, bilinen bir değer satırı, bir null değer satırı ekler ve ardından değerleri değişkenlere atayarak ve çıkışı konsol penceresinde görüntüleyerek aracılığıyla DataTableyinelenir.
static void WorkWithSqlNulls()
{
DataTable table = new();
// Specify the SqlType for each column.
DataColumn idColumn =
table.Columns.Add("ID", typeof(SqlInt32));
DataColumn descColumn =
table.Columns.Add("Description", typeof(SqlString));
// Add some data.
DataRow nRow = table.NewRow();
nRow["ID"] = 123;
nRow["Description"] = "Side Mirror";
table.Rows.Add(nRow);
// Add null values.
nRow = table.NewRow();
nRow["ID"] = SqlInt32.Null;
nRow["Description"] = SqlString.Null;
table.Rows.Add(nRow);
// Initialize variables to use when
// extracting the data.
SqlBoolean isColumnNull = false;
SqlInt32 idValue = SqlInt32.Zero;
SqlString descriptionValue = SqlString.Null;
// Iterate through the DataTable and display the values.
foreach (DataRow row in table.Rows)
{
// Assign values to variables. Note that you
// do not have to test for null values.
idValue = (SqlInt32)row["ID"];
descriptionValue = (SqlString)row["Description"];
// Test for null value in ID column.
isColumnNull = idValue.IsNull;
// Display variable values in console window.
Console.Write("isColumnNull={0}, ID={1}, Description={2}",
isColumnNull, idValue, descriptionValue);
Console.WriteLine();
}
Private Sub WorkWithSqlNulls()
Dim table As New DataTable()
' Specify the SqlType for each column.
Dim idColumn As DataColumn = _
table.Columns.Add("ID", GetType(SqlInt32))
Dim descColumn As DataColumn = _
table.Columns.Add("Description", GetType(SqlString))
' Add some data.
Dim row As DataRow = table.NewRow()
row("ID") = 123
row("Description") = "Side Mirror"
table.Rows.Add(row)
' Add null values.
row = table.NewRow()
row("ID") = SqlInt32.Null
row("Description") = SqlString.Null
table.Rows.Add(row)
' Initialize variables to use when
' extracting the data.
Dim isColumnNull As SqlBoolean = False
Dim idValue As SqlInt32 = SqlInt32.Zero
Dim descriptionValue As SqlString = SqlString.Null
' Iterate through the DataTable and display the values.
For Each row In table.Rows
' Assign values to variables. Note that you
' do not have to test for null values.
idValue = CType(row("ID"), SqlInt32)
descriptionValue = CType(row("Description"), SqlString)
' Test for null value with ID column
isColumnNull = idValue.IsNull
' Display variable values in console window.
Console.Write("isColumnNull={0}, ID={1}, Description={2}", _
isColumnNull, idValue, descriptionValue)
Console.WriteLine()
Next row
End Sub
Bu örnekte aşağıdaki sonuçlar görüntülenir:
isColumnNull=False, ID=123, Description=Side Mirror
isColumnNull=True, ID=Null, Description=Null
Birden Çok Sütun (Satır) Ataması
DataTable.Add
, DataTable.LoadDataRow
veya bir satıra eşlenen bir ItemArray değeri kabul eden diğer API'ler, 'null' öğesini DataColumn'un varsayılan değerine eşleyin. Dizideki bir nesne veya kesin olarak türü belirlenmiş bir karşılık içeriyorsa DbNull.Value
, yukarıda açıklanan kurallar uygulanır.
Ayrıca, null atamaların DataRow.["columnName"]
bir örneği için aşağıdaki kurallar geçerlidir:
Varsayılan değer,
DbNull.Value
kesin olarak yazılan null sütunlar dışında tümü içindir; burada uygun şekilde kesin olarak belirlenmiş null değerdir.Null değerler, XML dosyalarına seri hale getirme sırasında hiçbir zaman yazılır ("xsi:nil" içinde olduğu gibi).
Varsayılan değerler de dahil olmak üzere null olmayan tüm değerler, XML'ye seri hale getirilirken her zaman yazılır. Bu, null değerin (xsi:nil) açık olduğu ve varsayılan değerin örtük olduğu XSD/XML semantiğinden farklı değildir (XML'de yoksa, doğrulayan bir ayrıştırıcı bunu ilişkili bir XSD şemasından alabilir). Bunun tersi bir
DataTable
için geçerlidir: null değer örtük ve varsayılan değer açık.XML girişinden okunan satırlar için tüm eksik sütun değerleri NULL olarak atanır. veya benzer yöntemler kullanılarak NewRow oluşturulan satırlara DataColumn'un varsayılan değeri atanır.
IsNull yöntemi hem hem de
DbNull.Value
INullable.Null
için döndürürtrue
.
Null Değerleri SqlType'lar ve CLR Türleriyle Karşılaştırma
Null değerleri karşılaştırırken, yöntemin içindeki null değerleri System.Data.SqlTypes clr türleriyle çalışma biçimiyle karşılaştırıldığında değerlendirme yöntemi Equals
arasındaki farkı anlamak önemlidir. System.Data.SqlTypesEquals
Tüm yöntemler null değerleri değerlendirmek için veritabanı semantiğini kullanır: değerlerin biri veya her ikisi de null ise, karşılaştırma null verir. Öte yandan, ikisinde System.Data.SqlTypes CLR Equals
yönteminin kullanılması, her ikisi de null ise true sonucunu verir. Bu, CLR String.Equals
yöntemi gibi bir örnek yöntemi ile statik/paylaşılan yönteminin SqlString.Equals
kullanılması arasındaki farkı yansıtır.
Aşağıdaki örnek, her birine bir çift null değer ve String.Equals
ardından bir çift boş dize geçirildiğinde yöntem ile yöntemi arasındaki SqlString.Equals
sonuç farkını gösterir.
static void CompareNulls()
{
// Create two new null strings.
SqlString a = new();
SqlString b = new();
// Compare nulls using static/shared SqlString.Equals.
Console.WriteLine("SqlString.Equals shared/static method:");
Console.WriteLine(" Two nulls={0}", SqlStringEquals(a, b));
// Compare nulls using instance method String.Equals.
Console.WriteLine();
Console.WriteLine("String.Equals instance method:");
Console.WriteLine(" Two nulls={0}", StringEquals(a, b));
// Make them empty strings.
a = "";
b = "";
// When comparing two empty strings (""), both the shared/static and
// the instance Equals methods evaluate to true.
Console.WriteLine();
Console.WriteLine("SqlString.Equals shared/static method:");
Console.WriteLine(" Two empty strings={0}", SqlStringEquals(a, b));
Console.WriteLine();
Console.WriteLine("String.Equals instance method:");
Console.WriteLine(" Two empty strings={0}", StringEquals(a, b));
}
static string SqlStringEquals(SqlString string1, SqlString string2)
{
// SqlString.Equals uses database semantics for evaluating nulls.
var returnValue = SqlString.Equals(string1, string2).ToString();
return returnValue;
}
static string StringEquals(SqlString string1, SqlString string2)
{
// String.Equals uses CLR type semantics for evaluating nulls.
var returnValue = string1.Equals(string2).ToString();
return returnValue;
}
}
Private Sub CompareNulls()
' Create two new null strings.
Dim a As New SqlString
Dim b As New SqlString
' Compare nulls using static/shared SqlString.Equals.
Console.WriteLine("SqlString.Equals shared/static method:")
Console.WriteLine(" Two nulls={0}", SqlStringEquals(a, b))
' Compare nulls using instance method String.Equals.
Console.WriteLine()
Console.WriteLine("String.Equals instance method:")
Console.WriteLine(" Two nulls={0}", StringEquals(a, b))
' Make them empty strings.
a = ""
b = ""
' When comparing two empty strings (""), both the shared/static and
' the instance Equals methods evaluate to true.
Console.WriteLine()
Console.WriteLine("SqlString.Equals shared/static method:")
Console.WriteLine(" Two empty strings={0}", SqlStringEquals(a, b))
Console.WriteLine()
Console.WriteLine("String.Equals instance method:")
Console.WriteLine(" Two empty strings={0}", StringEquals(a, b))
End Sub
Private Function SqlStringEquals(ByVal string1 As SqlString, _
ByVal string2 As SqlString) As String
' SqlString.Equals uses database semantics for evaluating nulls.
Dim returnValue As String = SqlString.Equals(string1, string2).ToString()
Return returnValue
End Function
Private Function StringEquals(ByVal string1 As SqlString, _
ByVal string2 As SqlString) As String
' String.Equals uses CLR type semantics for evaluating nulls.
Dim returnValue As String = string1.Equals(string2).ToString()
Return returnValue
End Function
Kod aşağıdaki çıkışı oluşturur:
SqlString.Equals shared/static method:
Two nulls=Null
String.Equals instance method:
Two nulls=True
SqlString.Equals shared/static method:
Two empty strings=True
String.Equals instance method:
Two empty strings=True