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.)

Truth Table

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 IsNulldışı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 DataSetiç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 DataColumnDataRow 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ü uygularsaINullableDBNull.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 DataColumniliş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.Valueolarak depolanır.

Not

Nullable<T> veya Nullable yapısı şu anda içinde DataSetdesteklenmiyor.

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 DbNulltek 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.LoadDataRowveya 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:

  1. 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.

  2. 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).

  3. 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 DataTableiçin geçerlidir: null değer örtük ve varsayılan değer açık.

  4. 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.

  5. IsNull yöntemi hem hem de DbNull.ValueINullable.Nulliç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.Equalskullanı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

Ayrıca bkz.