Nagy értékű (maximális) adatok módosítása a ADO.NET
A nagy méretű objektum (LOB) adattípusok azok, amelyek túllépik a 8 kilobájtos (KB) maximális sorméretet. Az SQL Server a max
2^32 bájt méretű értékek tárolására szolgáló , és varbinary
adattípusokhoz biztosít megadótvarchar
nvarchar
. A táblaoszlopok és a Transact-SQL-változók megadhatnak varchar(max)
, nvarchar(max)
vagy varbinary(max)
adattípusokat. A ADO.NET az max
adattípusokat lekérheti egy DataReader
, és a bemeneti és kimeneti paraméterértékként is megadható speciális kezelés nélkül. Nagy varchar
adattípusok esetén az adatok növekményesen kérhetők le és frissíthetők.
Az max
adattípusok használhatók összehasonlításokhoz, Transact-SQL-változókként és összefűzéshez. A Standard kiadás LECT utasítás DISTINCT, ORDER BY, GROUP BY záradékaiban, valamint összesítésekben, illesztésekben és alquerykben is használhatók.
További információ: Nagy értékű adattípusok használata.
Nagy értékű típuskorlátozások
A következő korlátozások vonatkoznak azokra az max
adattípusokra, amelyek kisebb adattípusok esetében nem léteznek:
A fájl
sql_variant
nem tartalmazhat nagyvarchar
adattípust.A nagy
varchar
oszlopok nem adhatók meg kulcsoszlopként egy indexben. A nem fürtözött indexek belefoglalt oszlopaiban engedélyezettek.A nagy
varchar
oszlopok nem használhatók particionálási kulcsoszlopokként.
Nagy értékű típusok használata a Transact-SQL-ben
A Transact-SQL OPENROWSET
függvény egyszeri módszer a távoli adatok csatlakoztatására és elérésére. Tartalmazza az OLE DB-adatforrásból származó távoli adatok eléréséhez szükséges összes kapcsolati információt. OPENROWSET
a lekérdezés FROM záradékában úgy hivatkozhat rá, mintha táblanév lenne. In Standard kiadás RT, UPDATE vagy DELETE utasítás céltáblájaként is hivatkozhat rá, az OLE DB-szolgáltató képességeinek függvényében.
A OPENROWSET
függvény tartalmazza a BULK
sorhalmaz-szolgáltatót, amely lehetővé teszi az adatok közvetlen beolvasását egy fájlból anélkül, hogy betöltenie az adatokat egy céltáblába. Ez lehetővé teszi egy egyszerű IN Standard kiadás RT Standard kiadás LECT utasítás használatátOPENROWSET
.
A OPENROWSET BULK
beállításargumentumok jelentős mértékben befolyásolják az olvasási adatok kezdő és befejező helyét, a hibák kezelését és az adatok értelmezésének módját. Megadhatja például, hogy az adatfájl egysoros, egyoszlopos sorhalmazként varbinary
legyen beolvasva. varchar
nvarchar
Az alábbi példa beszúr egy fényképet az AdventureWorks mintaadatbázis ProductPhoto táblázatába. A szolgáltató használatakor BULK OPENROWSET
akkor is meg kell adnia az oszlopok elnevezett listáját, ha nem szúr be értékeket minden oszlopba. Ebben az esetben az elsődleges kulcs identitásoszlopként van definiálva, és kihagyható az oszloplistából. Vegye figyelembe, hogy az utasítás végén OPENROWSET
meg kell adnia egy korrelációs nevet is, amely ebben az esetben a ThumbnailPhoto. Ez korrelál a táblázat azon oszlopával ProductPhoto
, amelybe a fájlt betölti.
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
Adatok frissítése az UPDATE használatával. ÍRNI
A Transact-SQL UPDATE utasítás új WRITE szintaxissal rendelkezik a , nvarchar(max)
vagy varbinary(max)
oszlopok tartalmának varchar(max)
módosításához. Ez lehetővé teszi az adatok részleges frissítését. Az UPDATE . A WRITE szintaxis rövidített formában jelenik meg:
UPDATE
{ <object> }
SET
{ column_name = { . WRITE ( kifejezés , @Offset ) @Length }
A WRITE metódus azt határozza meg, hogy a column_name értékének egy szakasza módosuljon. A kifejezés az az érték, amely a column_name lesz másolva, az @Offset
a kezdőpont, ahol a kifejezés meg lesz írva, az @Length
argumentum pedig az oszlopban lévő szakasz hossza.
If | Akkor |
---|---|
A kifejezés null értékűre van állítva | @Length a rendszer figyelmen kívül hagyja, és az column_name értéke csonkolt a megadott @Offset . |
@Offset null értékű |
A frissítési művelet hozzáfűzi a kifejezést a meglévő column_name érték végéhez, és @Length figyelmen kívül hagyja. |
@Offset nagyobb, mint a column_name érték hossza |
Az SQL Server hibát ad vissza. |
@Length null értékű |
A frissítési művelet eltávolítja az összes adatot az column_name érték végétől @Offset a végéig. |
Feljegyzés
Sem negatív szám, sem @Offset
@Length
nem lehet negatív szám.
Példa
Ez a Transact-SQL-példa frissíti a DocumentSummary egy részleges értékét, amely az AdventureWorks-adatbázis Dokumentum táblájának egy nvarchar(max)
oszlopa. Az "összetevők" szót a "features" szó váltja fel a helyettesítő szó, a lecserélendő szó kezdő helye (eltolása) megadásával a meglévő adatokban, valamint a lecserélendő karakterek számának (hosszúságának) megadásával. A példa Standard kiadás LECT-utasításokat tartalmaz az UPDATE utasítás előtt és után az eredmények összehasonlításához.
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.
Nagyméretű értéktípusok használata a ADO.NET
A nagy értéktípusokkal a ADO.NET dolgozhat, ha nagy értéktípusokat ad meg objektumként SqlParameter egy eredményhalmaz visszaadásához, vagy SqlDataAdapter egy kitöltéshez DataSet
/DataTable
használva.SqlDataReader Nincs különbség a nagy értéktípus és a kapcsolódó, kisebb érték adattípus között.
GetSqlBytes használata adatok lekéréséhez
Az GetSqlBytes
oszlop tartalmának lekéréséhez varbinary(max)
a metódus SqlDataReader használható. Az alábbi kódrészlet egy SqlCommand olyan objektumot cmd
feltételez, amely egy táblából választ ki varbinary(max)
adatokat, és egy SqlDataReader olyan objektumot, reader
amely az adatokat a következőképpen SqlByteskéri le.
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);
}
Adatok lekérése a GetSqlChars használatával
A GetSqlChars
metódus SqlDataReader használatával lekérheti egy vagy nvarchar(max)
több oszlop tartalmátvarchar(max)
. Az alábbi kódrészlet egy SqlCommand olyan objektumot cmd
feltételez, amely egy táblából választ ki nvarchar(max)
adatokat, és egy SqlDataReader olyan objektumot, amely reader
lekéri az adatokat.
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);
}
Adatok lekérése a GetSqlBinary használatával
A GetSqlBinary
metódus SqlDataReader egy oszlop tartalmának lekérésére varbinary(max)
használható. Az alábbi kódrészlet egy SqlCommand olyan objektumot cmd
feltételez, amely egy táblából választ ki varbinary(max)
adatokat, és egy SqlDataReader olyan objektumot, reader
amely adatfolyamként SqlBinary kéri le az adatokat.
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);
}
GetBytes használata adatok lekéréséhez
A GetBytes
metódus SqlDataReader bájtokból álló adatfolyamot olvas be a megadott oszlopeltolásból egy bájttömbbe a megadott tömbeltolástól kezdve. Az alábbi kódrészlet feltételez egy SqlDataReader olyan objektumot, amely reader
bájtokat kér le egy bájttömbbe. Vegye figyelembe, hogy ellentétben GetSqlBytes
a GetBytes
tömbpuffer méretével.
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);
}
Adatok lekérése a GetValue használatával
A GetValue
metódus SqlDataReader beolvassa a megadott oszlopeltolás értékét egy tömbbe. A következő kódrészlet feltételez egy SqlDataReader olyan objektumot, amely reader
az első oszlopeltolásból, majd a második oszlop eltolásából kéri le a bináris adatokat.
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);
}
Konvertálás nagy értéktípusokból CLR-típusokká
Egy vagy nvarchar(max)
több oszlop tartalmát bármely sztringkonvertálási varchar(max)
módszerrel konvertálhatja, példáulToString
. Az alábbi kódrészlet feltételezi, hogy egy SqlDataReader nevű objektum reader
kéri le az adatokat.
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);
}
Példa
Az alábbi kód lekéri a nevet és az LargePhoto
objektumot az ProductPhoto
AdventureWorks
adatbázis táblájából, és menti egy fájlba. A szerelvényt a névtérre mutató hivatkozással kell lefordítani System.Drawing . A GetSqlBytes metódus SqlDataReader egy SqlBytes tulajdonságot elérhetővé tevő Stream
objektumot ad vissza. A kód ezzel létrehoz egy új Bitmap
objektumot, majd menti azt a Gif ImageFormat
fájlba.
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("{0} is unavailable.", photoName);
}
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 {0}.", 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 Bitmap = _
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
Nagy értékű típusparaméterek használata
A nagy értéktípusok ugyanúgy használhatók az objektumokban SqlParameter , mint az objektumok kisebb SqlParameter értéktípusai. A nagy értéktípusokat lekérheti értékekként SqlParameter , ahogyan az alábbi példában is látható. A kód feltételezi, hogy a következő GetDocumentSummary tárolt eljárás létezik az AdventureWorks mintaadatbázisban. A tárolt eljárás egy elnevezett @DocumentID bemeneti paramétert vesz fel, és visszaadja a DocumentSummary oszlop tartalmát a @DocumentSummary kimeneti paraméterben.
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
Példa
A ADO.NET kód létrehozza SqlConnection és SqlCommand objektumokkal végrehajtja a GetDocumentSummary tárolt eljárást, és lekéri a nagy értéktípusként tárolt dokumentum összegzését. A kód átadja a @DocumentID bemeneti paraméter értékét, és megjeleníti a konzolablak kimeneti paraméterében @DocumentSummary visszaadott eredményeket.
static string? GetDocumentSummary(int documentID)
{
//Assumes GetConnectionString returns a valid connection string.
using (SqlConnection connection =
new(GetConnectionString()))
{
connection.Open();
SqlCommand command = connection.CreateCommand();
try
{
// Setup 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