Aracılığıyla paylaş


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 select deyiminin DISTINCT, ORDER BY, GROUP BY yan tümcelerinde ve toplamalarda, 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 tablo adıymış gibi başvurulabilir. Ayrıca, OLE DB sağlayıcısının özelliklerine bağlı olarak INSERT, UPDATE veya DELETE deyiminin hedef tablosu olarak da başvurulabilir.

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, basit bir INSERT SELECT deyiminde kullanmanızı OPENROWSET 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

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

Güncelleme

{ <object> }

AYARLAMAK

{ 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 ayarlandı @Length göz ardı edilir ve column_name değeri belirtilen konumda @Offsetkesilir.
@Offset NULL olarak 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 NULL olarak 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 UPDATE deyiminden önceki ve sonraki SELECT deyimlerini 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

ADO.NET'te büyük değer türleriyle çalışabilirsiniz; bunu, SqlParameter içinde büyük değer türlerini SqlDataReader nesneleri olarak belirterek bir sonuç kümesi döndürerek veya SqlDataAdapterDataSet/ doldurmak için DataTable kullanarak yapabilirsiniz. Büyük bir veri türü ile ilişkili, daha küçük veri türüyle çalışma biçiminiz arasında hiçbir fark yoktur.

Veri Almak için GetSqlBytes Kullanma

GetSqlBytes yöntemi SqlDataReader bir varbinary(max) sütunun içeriğini almak için kullanılabilir. Aşağıdaki kod parçası, bir tablodan SqlCommand verisini seçen cmd adlı bir varbinary(max) nesnesi ile verileri SqlDataReader olarak alan reader adlı bir SqlBytes nesnesi 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

GetSqlChars yöntemi SqlDataReader bir varchar(max) veya nvarchar(max) sütununun içeriğini almak için kullanılabilir. Aşağıdaki kod parçası, bir tablodan veri seçen SqlCommand adlı cmd bir nvarchar(max) nesnenin ve verileri alan adlı SqlDataReader bir reader nesnenin 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

GetSqlBinary yöntemini, SqlDataReader sütunun içeriğini elde etmek için kullanabilirsiniz. Aşağıdaki kod parçası, bir tablodan SqlCommand verilerini seçen cmd adlı bir varbinary(max) nesne ve bu verileri bir SqlDataReader akışı olarak alan reader adlı bir SqlBinary nesne 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ığından başlayarak bir bayt akışını belirtilen dizi uzaklığından başlayarak bir bayt dizisine okur. Aşağıdaki kod parçası, baytları bir bayt dizisine alan SqlDataReader adlı reader nesnesinin olduğunu varsayar. GetSqlBytes'den farklı olarak, GetBytes dizi arabelleği için bir boyut gerektirir, bunu unutmayın.

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, SqlDataReader belirtilen sütun kaydırmasından değeri bir diziye okur. Aşağıdaki kod parçası, ilk sütun uzaklığından ikili verileri alan ve ardından ikinci sütun uzaklığından dize verilerini alan SqlDataReader adlı bir reader nesnesini varsayar.

While reader.Read()  
    ' Read the data from varbinary(max) column  
    Dim binaryData() As Byte = CByte(reader.GetValue(0))  
  
    ' 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

Şunun gibi dize dönüştürme yöntemlerinden herhangi birini kullanarak bir varchar(max) veya nvarchar(max) sütununun içeriğini dönüştürebilirsiniz: ToString. Aşağıdaki kod parçası, verileri alan SqlDataReader adlı reader nesnesini 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, LargePhoto veritabanındaki ProductPhoto tablosundan AdventureWorks adı ve nesneyi alır ve bir dosyaya kaydeder. Derlemenin System.Drawing ad alanına bir referansla derlenmesi gerekir. GetSqlBytes yöntemi, bir SqlDataReader nesnesi döndürür ve bu nesne bir SqlBytes özelliği sunar. Kod, yeni Bitmap bir nesne oluşturmak için bunu kullanır ve gif'e ImageFormatkaydeder.

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