Dil

ADO.NET'da Large-Value (maksimum) Verileri Değiştirme

Büyük nesne (LOB) veri türleri, en fazla 8 kilobayt (KB) satır boyutunu aşanlardır. SQL Server, 2^32 bayt kadar büyük değerlerin depolanmasına izin vermek için , maxve varchar veri türleri için nvarcharbir varbinary tanımlayıcı sağlar. Tablo sütunları ve Transact-SQL değişkenleri , varchar(max)veya nvarchar(max) veri türlerini belirtebilirvarbinary(max). ADO.NET'te max tarafından DataReader veri türleri getirilebilir ve özel işleme gerek olmadan hem giriş hem de çıkış parametresi değerleri olarak belirtilebilir. Büyük varchar veri türleri için veriler artımlı olarak alınabilir ve güncelleştirilebilir.

Veri max türleri karşılaştırmalar, Transact-SQL değişkenleri ve birleştirme amacıyla kullanılabilir. Bunlar ayrıca SELECT deyiminin DISTINCT, ORDER BY, GROUP BY yan tümcelerinde ve küme işlevlerinde, birleştirmelerde ve alt sorgularda da kullanılabilir.

Daha fazla bilgi için bkz . Large-Value Veri Türlerini Kullanma.

Large-Value Türü Kısıtlamaları

Aşağıdaki kısıtlamalar, daha küçük veri türleri için mevcut olmayan veri türleri için geçerlidir max :

  • A sql_variant , büyük varchar bir veri türü içeremez.

  • Büyük varchar sütunlar bir dizinde anahtar sütun olarak belirtilemez. Kümelenmemiş bir dizinde yer alan bir sütunda bunlara izin verilir.

  • Büyük varchar sütunlar bölümleme anahtarı sütunları olarak kullanılamaz.

Transact-SQL'da Large-Value Türleriyle Çalışma

Transact-SQL OPENROWSET işlevi, uzak verilere bağlanmak ve verilere erişmek için tek seferlik bir yöntemdir. Bir OLE DB veri kaynağından uzak verilere erişmek için gereken tüm bağlantı bilgilerini içerir. OPENROWSET, bir sorgunun FROM yan tümcesinde sanki bir tablo adıymış gibi kullanılabilir. OLE DB sağlayıcısının özelliklerine bağlı olarak, bir INSERT, UPDATE veya DELETE deyiminin hedef tablosu olarak da kullanılabilir.

OPENROWSET işlevi, verileri hedef tabloya BULK yüklemeden doğrudan bir dosyadan okumanızı sağlayan satır kümesi sağlayıcısını içerir. Bu, INSERT SELECT öğesini basit bir OPENROWSET ifadede kullanmanızı sağlar.

Seçenek OPENROWSET BULK bağımsız değişkenleri, okuma verilerinin nereden başlayacağı ve biteceği, hatalarla nasıl başa çıkıldığı ve verilerin nasıl yorumlandığı üzerinde önemli bir denetim sağlar. Örneğin, veri dosyasının , varbinaryveya varchartüründe nvarchartek satırlı, tek sütunlu satır kümesi olarak okunmasını belirtebilirsiniz.

Aşağıdaki örnek, AdventureWorks örnek veritabanındaki ProductPhoto tablosuna bir fotoğraf ekler. Sağlayıcıyı kullanırken, her sütuna BULK OPENROWSET değer eklemeseniz bile adlandırılmış sütun listesini sağlamanız gerekir. Bu durumda birincil anahtar bir kimlik sütunu olarak tanımlanır ve sütun listesinden atlanabilir. Deyimin sonunda da bir bağıntı OPENROWSET adı sağlamanız gerektiğini unutmayın. Bu örnekte ThumbnailPhoto değeridir. Bu, dosyanın yüklendiği tablodaki ProductPhoto sütunla bağıntılı olur.

INSERT Production.ProductPhoto (
    ThumbnailPhoto,
    ThumbnailPhotoFilePath,
    LargePhoto,
    LargePhotoFilePath)
SELECT ThumbnailPhoto.*, null, null, N'tricycle_pink.gif'
FROM OPENROWSET
    (BULK 'c:\images\tricycle.jpg', SINGLE_BLOB) ThumbnailPhoto

UPDATE .WRITE Kullanarak Verilerin Güncellenmesi

Transact-SQL UPDATE deyimi, varbinary(max), varchar(max) veya WRITE sütunlarının içeriğini değiştirmek için yeni nvarchar(max) söz dizimine sahiptir. Bu, verilerin kısmi güncelleştirmelerini gerçekleştirmenizi sağlar. Söz UPDATE .WRITE dizimi burada kısaltılmış biçimde gösterilir:

UPDATE

{ <object> }

SET

{ column_name = { .WRITE ( ifade , @Offset , @Length ) }

WRITE yöntemi, column_name değerinin bir bölümünün değiştirileceğini belirtir. İfade, column_name sütununa kopyalanacak değerdir, @Offset ifadenin yazılacağı başlangıç noktasıdır ve @Length bağımsız değişkeni, sütundaki bölümün uzunluğudur.

Eğer Ardından
İfade NULL olarak ayarlanmıştır @Length göz ardı edilir ve column_name değeri belirtilen konumda @Offsetkesilir.
@Offset eşittir NULL Güncelleştirme işlemi, ifadeyi mevcut column_name değerinin sonuna ekler ve @Length yoksayılır.
@Offset column_name değerinin uzunluğundan büyük SQL Server bir hata döndürür.
@Length eşittir NULL Güncelleştirme işlemi, değerin @Offset sonuna column_name kadar olan tüm verileri kaldırır.

Uyarı

@Offset ve @Length negatif sayı olamaz.

Örnek

Bu Transact-SQL örnek, AdventureWorks veritabanındaki Document tablosundaki bir sütun olan DocumentSummary'deki kısmi değeri nvarchar(max) güncelleştirir. 'components' sözcüğü yerine geçen sözcük, var olan verilerde değiştirilecek sözcüğün başlangıç konumu (uzaklık) ve değiştirilecek karakter sayısı (uzunluk) belirtilerek 'özellikler' sözcüğüyle değiştirilir. Örnek, sonuçları karşılaştırmak için SELECT deyiminden önce ve sonra UPDATE deyimleri içerir.

USE AdventureWorks;
GO
--View the existing value.
SELECT DocumentSummary
FROM Production.Document
WHERE DocumentID = 3;
GO
-- The first sentence of the results will be:
-- Reflectors are vital safety components of your bicycle.

--Modify a single word in the DocumentSummary column
UPDATE Production.Document
SET DocumentSummary .WRITE (N'features',28,10)
WHERE DocumentID = 3 ;
GO
--View the modified value.
SELECT DocumentSummary
FROM Production.Document
WHERE DocumentID = 3;
GO
-- The first sentence of the results will be:
-- Reflectors are vital safety features of your bicycle.

ADO.NET'da Large-Value Türleriyle Çalışma

Büyük değerler göndermek için SqlParameter ile SqlCommand nesnelerini kullanın. SqlDataReader ile sonuçları alın veya DataSet ya da DataTable nesnelerini SqlDataAdapter ile doldurun. Büyük değer türlerini, ilişkili daha küçük değer veri türlerini işlediğiniz gibi işlersiniz.

Veri Almak için GetSqlBytes Kullanma

Bir varbinary(max) sütununun içeriğini SqlBytes olarak almak için GetSqlBytes çağrısı yapın. Aşağıdaki parça, SqlDataReader öğesinin ikili verileri seçen cmd ve SqlCommand öğesinin bunları alan reader olduğunu varsayar.

reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
While reader.Read()
    Dim bytes As SqlBytes = reader.GetSqlBytes(0)
End While
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
while (reader.Read())
    {
        SqlBytes bytes = reader.GetSqlBytes(0);
    }

Veri Almak için GetSqlChars Kullanma

Bir varchar(max) veya nvarchar(max) sütununun içeriğini almak için GetSqlChars çağırın. Aşağıdaki parça, SqlDataReader öğesinin nvarchar(max) verilerini seçen reader olduğunu ve cmd öğesinin bunları alan SqlCommand olduğunu varsayar.

reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
While reader.Read()
    Dim buffer As SqlChars = reader.GetSqlChars(0)
End While
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
while (reader.Read())
{
    SqlChars buffer = reader.GetSqlChars(0);
}

Veri Almak için GetSqlBinary Kullanma

Bir varbinary(max) sütunun içeriğini değer olarak SqlBinary almak için GetSqlBinary çağrısı yapın. Aşağıdaki parça, SqlDataReader öğesinin ikili verileri seçen cmd ve SqlCommand öğesinin bu verileri alan reader olduğunu varsayar.

reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
While reader.Read()
    Dim binaryStream As SqlBinary = reader.GetSqlBinary(0)
End While
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
while (reader.Read())
    {
        SqlBinary binaryStream = reader.GetSqlBinary(0);
    }

Veri Almak için GetBytes Kullanma

GetBytes yöntemi, belirtilen sütun uzaklığındaki baytları belirtilen dizi uzaklığındaki bir bayt dizisine okur. Aşağıdaki parça, reader öğesinin baytları alan SqlDataReader olduğunu varsayar. GetBytes'nin aksineGetSqlBytes, dizi arabelleği için bir boyut gerektirir.

While reader.Read()
    Dim buffer(4000) As Byte
    Dim byteCount As Integer = _
    CInt(reader.GetBytes(1, 0, buffer, 0, 4000))
End While
while (reader.Read())
{
    byte[] buffer = new byte[4000];
    long byteCount = reader.GetBytes(1, 0, buffer, 0, 4000);
}

Veri Almak için GetValue Kullanma

GetValue yöntemi sütun değerini bir nesne olarak döndürür. Aşağıdaki parça, SqlDataReader öğesinin reader olduğunu varsayar. C# dilinde ikili sütun döndürür byte[] ve karakter sütunu döndürür string. Visual Basic'de, karşılık gelen türler String ve Byte()'dir.

While reader.Read()
    ' Read the data from varbinary(max) column
    Dim binaryData() As Byte = CType(reader.GetValue(0), Byte())

    ' Read the data from varchar(max) or nvarchar(max) column
    Dim stringData As String = CStr(reader.GetValue(1))
End While
while (reader.Read())
{
    // Read the data from varbinary(max) column
    byte[] binaryData = (byte[])reader.GetValue(0);

    // Read the data from varchar(max) or nvarchar(max) column
    String stringData = (String)reader.GetValue(1);
}

Büyük Değer Türlerinden CLR Türlerine Dönüştürme

varchar(max) veya nvarchar(max) sütununun içeriğini, ToString gibi dize dönüştürme yöntemleriyle dönüştürebilirsiniz. Aşağıdaki parça, reader öğesinin verileri alan SqlDataReader olduğunu varsayar.

While reader.Read()
    Dim str as String = reader(0).ToString()
    Console.WriteLine(str)
End While
while (reader.Read())
{
     string str = reader[0].ToString();
     Console.WriteLine(str);
}

Örnek

Aşağıdaki kod, ProductPhoto veritabanındaki AdventureWorks tablosundan adı ve LargePhoto değerini alır ve bunları bir dosyaya kaydeder. Bu görüntü dönüştürme örneği için Windows ve System.Drawing.Common NuGet paketi gerekir. Bu kısıtlama, sağlayıcının ikili veri alma işlemi için değil görüntü dönüştürme için geçerlidir. GetSqlBytes yöntemi, SqlBytes özelliğini kullanıma sunan Stream döndürür. Kod, Bitmap nesnesini oluşturmak için akışı kullanır ve GIF biçiminde kaydeder.

static void TestGetSqlBytes(int documentID, string filePath)
{
    // Assumes GetConnectionString returns a valid connection string.
    using (SqlConnection connection =
               new(GetConnectionString()))
    {
        SqlCommand command = connection.CreateCommand();
        SqlDataReader reader = default!;
        try
        {
            // Setup the command
            command.CommandText =
                "SELECT LargePhotoFileName, LargePhoto "
                + "FROM Production.ProductPhoto "
                + "WHERE ProductPhotoID=@ProductPhotoID";
            command.CommandType = CommandType.Text;

            // Declare the parameter
            SqlParameter paramID =
                new("@ProductPhotoID", SqlDbType.Int)
                {
                    Value = documentID
                };
            command.Parameters.Add(paramID);
            connection.Open();

            string photoName = default!;

            reader = command.ExecuteReader(CommandBehavior.CloseConnection);

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    // Get the name of the file.
                    photoName = reader.GetString(0);

                    // Ensure that the column isn't null
                    if (reader.IsDBNull(1))
                    {
                        Console.WriteLine($"{photoName} is unavailable.");
                    }
                    else
                    {
                        SqlBytes bytes = reader.GetSqlBytes(1);
                        using (Bitmap productImage = new(bytes.Stream))
                        {
                            var fileName = filePath + photoName;

                            // Save in gif format.
                            productImage.Save(fileName, ImageFormat.Gif);
                            Console.WriteLine($"Successfully created {fileName}.");
                        }
                    }
                }
            }
            else
            {
                Console.WriteLine("No records returned.");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {
            reader?.Dispose();
        }
    }
}
Private Sub GetPhoto(
  ByVal documentID As Integer, ByVal filePath As String)
    ' Assumes GetConnectionString returns a valid connection string.
    Using connection As New SqlConnection(GetConnectionString())
        Dim command As SqlCommand = connection.CreateCommand()
        Dim reader As SqlDataReader
        Try
            ' Setup the command
            command.CommandText =
              "SELECT LargePhotoFileName, LargePhoto FROM" _
                & " Production.ProductPhoto" _
                & " WHERE ProductPhotoID=@ProductPhotoID"
            command.CommandType = CommandType.Text

            ' Declare the parameter
            Dim paramID As SqlParameter =
                New SqlParameter("@ProductPhotoID", SqlDbType.Int)
            paramID.Value = documentID
            command.Parameters.Add(paramID)
            connection.Open()

            Dim photoName As String

            reader =
             command.ExecuteReader(CommandBehavior.CloseConnection)

            If reader.HasRows Then
                While reader.Read()
                    ' Get the name of the file
                    photoName = reader.GetString(0)

                    ' Ensure that the column isn't null
                    If (reader.IsDBNull(1)) Then
                        Console.WriteLine("{0} is unavailable.", photoName)
                    Else
                        Dim bytes As SqlBytes = reader.GetSqlBytes(1)
                        Using productImage As New Bitmap(bytes.Stream)
                            Dim fileName As String = filePath & photoName

                            ' Save in gif format.
                            productImage.Save(
                              fileName, ImageFormat.Gif)
                            Console.WriteLine("Successfully created {0}.", fileName)
                        End Using
                    End If
                End While
            Else
                Console.WriteLine("No records returned.")
            End If
        Catch ex As Exception
            Console.WriteLine("Exception: {0}", ex.Message)
        End Try
    End Using
End Sub

Büyük Değer Türü Parametrelerini Kullanma

Büyük değer türleri, SqlParameter nesnelerinde, SqlParameter nesnelerinde daha küçük değer türleri kullandığınız şekilde kullanılabilir. Aşağıdaki örnekte gösterildiği gibi büyük değer türlerini SqlParameter değerleri olarak geri alabilirsiniz. Kod, AdventureWorks örnek veritabanında aşağıdaki GetDocumentSummary saklı yordamının mevcut olduğunu varsayar. Saklı yordam adlı @DocumentID bir giriş parametresi alır ve çıkış parametresindeki DocumentSummary sütununun @DocumentSummary içeriğini döndürür.

CREATE PROCEDURE GetDocumentSummary
(
    @DocumentID int,
    @DocumentSummary nvarchar(MAX) OUTPUT
)
AS
SET NOCOUNT ON
SELECT  @DocumentSummary=Convert(nvarchar(MAX), DocumentSummary)
FROM    Production.Document
WHERE   DocumentID=@DocumentID

Örnek

ADO.NET kodu, büyük bir değer türü olarak depolanan belge özetini almak ve SqlConnection ve SqlCommand nesnelerini oluşturup GetDocumentSummary saklı yordamını yürütmek için kullanılır. Kod giriş parametresi için @DocumentID bir değer geçirir ve konsol penceresinde çıkış parametresinde @DocumentSummary geri geçirilen sonuçları görüntüler.

static string? GetDocumentSummary(int documentID)
{
    // Assumes GetConnectionString returns a valid connection string.
    using (SqlConnection connection =
               new(GetConnectionString()))
    {
        connection.Open();
        SqlCommand command = connection.CreateCommand();
        try
        {
            // Set up the command to execute the stored procedure.
            command.CommandText = "GetDocumentSummary";
            command.CommandType = CommandType.StoredProcedure;

            // Set up the input parameter for the DocumentID.
            SqlParameter paramID =
                new("@DocumentID", SqlDbType.Int)
                {
                    Value = documentID
                };
            command.Parameters.Add(paramID);

            // Set up the output parameter to retrieve the summary.
            SqlParameter paramSummary =
                new("@DocumentSummary",
                SqlDbType.NVarChar, -1)
                {
                    Direction = ParameterDirection.Output
                };
            command.Parameters.Add(paramSummary);

            // Execute the stored procedure.
            command.ExecuteNonQuery();
            Console.WriteLine((string)paramSummary.Value);
            return (string)paramSummary.Value;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            return null;
        }
    }
}
Private Function GetDocumentSummary( _
  ByVal documentID As Integer) As String

    ' Assumes GetConnectionString returns a valid connection string.
    Using connection As New SqlConnection(GetConnectionString())
        connection.Open()
        Dim command As SqlCommand = connection.CreateCommand()

        ' Setup the command to execute the stored procedure.
        command.CommandText = "GetDocumentSummary"
        command.CommandType = CommandType.StoredProcedure

        ' Set up the input parameter for the DocumentID.
        Dim paramID As SqlParameter = _
            New SqlParameter("@DocumentID", SqlDbType.Int)
        paramID.Value = documentID
        command.Parameters.Add(paramID)

        ' Set up the output parameter to retrieve the summary.
        Dim paramSummary As SqlParameter = _
            New SqlParameter("@DocumentSummary", _
               SqlDbType.NVarChar, -1)
        paramSummary.Direction = ParameterDirection.Output
        command.Parameters.Add(paramSummary)

        ' Execute the stored procedure.
        command.ExecuteNonQuery()
        Console.WriteLine(paramSummary.Value)
        Return paramSummary.Value.ToString
    End Using
End Function

Ayrıca bakınız