Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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ükvarcharbir veri türü içeremez.Büyük
varcharsütunlar bir dizinde anahtar sütun olarak belirtilemez. Kümelenmemiş bir dizinde yer alan bir sütunda bunlara izin verilir.Büyük
varcharsü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
- SQL Server İkili ve Large-Value Verileri
- SQL Server Veri Türü Eşlemeleri
- ADO.NET'da SQL Server Veri İşlemleri
- ADO.NET’e Genel Bakış