Megosztás a következőn keresztül:


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ótvarcharnvarchar. 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 nagy varchar 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 varbinarylegyen beolvasva. varcharnvarchar

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 @Lengtha 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/DataTablehaszná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 GetSqlBytesa 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 ProductPhotoAdventureWorks 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 ImageFormatfá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

Lásd még