Megosztás:


Nagy értékű (maximális) adatok módosítása ADO.NET

ADO.NET letöltése

A nagy méretű objektum (LOB) adattípusok azok, amelyek túllépik a 8 kilobájtos (KB) maximális sorméretet. SQL Server biztosít egy max megadót a varchar, nvarchar és varbinary adattípusokhoz, amely lehetővé teszi olyan értékek tárolását, amelyek mérete legfeljebb 2^32 bájt lehet. A táblaoszlopok és Transact-SQL változók megadhatnak varchar(max), nvarchar(max)vagy varbinary(max) adattípusokat. A .NET-ben az max adattípusok lekérhetők egy DataReader, és külön kezelés nélkül is megadható bemeneti és kimeneti paraméterértékként. 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ókhoz és összefűzéshez. A SELECT utasítás DISTINCT, ORDER BY, GROUP BY záradékaiban, valamint összesítésekben, összekapcsolásokban, és al-lekérdezésekben is használhatók.

Lásd a nagyértékű adattípusok használatáról további információt az SQL Server Books Online Using Large-Value Data Types című témakörében.

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. Nem fürtözött indexben található, bevezetett oszlopokban megengedettek.

  • A nagy varchar oszlopok nem használhatók particionálási kulcsoszlopokként.

Nagy értékű típusok használata a Transact-SQL

A Transact-SQL OPENROWSET függvény egy egyszeri módszer a távoli adatok csatlakoztatására és elérésére. OPENROWSET a lekérdezés FROM záradékában úgy hivatkozhat rá, mintha táblanév lenne. Az INSERT, UPDATE vagy DELETE utasítás céltáblájaként is hivatkozhat rá.

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ű INSERT SELECT utasítás használatát OPENROWSET .

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 A teljes szintaxist és beállításokat az SQL Server Books Online-ban talál.

Az alábbi példa egy fényképet szúr be a mintaadatbázis ProductPhoto táblázatába AdventureWorks2025 . Amikor a BULK OPENROWSET szolgáltatót használja, 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 a OPENROWSET utasítás végén 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 .WRITE használatával

Az Transact-SQL UPDATE utasítás új ÍRÁSi szintaxissal rendelkezik a , varchar(max)vagy nvarchar(max) oszlopok tartalmának varbinary(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:

Frissítés

{ <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 figyelmen kívül van hagyva, és az column_name értéke a megadott @Offset-nél van csonkolva.
@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 meghaladja a column_name érték hosszát Az SQL Server hibát ad vissza.
@Length null értékű A frissítési művelet eltávolítja az összes adatot az @Offset érték végétől column_name a végéig.

Megjegyzés:

Sem a @Offset, sem a @Length nem lehet negatív szám.

Example

Ez a Transact-SQL példa egy részleges értéket frissít a DocumentSummaryban, 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 az UPDATE utasítás előtti és utáni SELECT utasításokat is tartalmazza az eredmények összehasonlításához.

USE AdventureWorks2022;
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.  

Nagy értékű típusok használata a ADO.NET

A nagy értéktípusokkal az ADO.NET-ben dolgozhat, ha nagy értéktípusokat objektumként ad meg SqlParameter, egy eredményhalmaz visszaadásához, vagy SqlDataReader használva egy SqlDataAdapterDataSet/, a kitöltéshez.DataTable 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 SqlDataReader metódus használható az varbinary(max) oszlop tartalmának lekérésére. 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())  
    {  
        SqlBytes bytes = reader.GetSqlBytes(0);  
    }  

Adatok lekérése a GetSqlChars használatával

A SqlDataReaderGetSqlChars módszere használható a varchar(max) vagy nvarchar(max) oszlop tartalmának lekérésére. 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())  
{  
    SqlChars buffer = reader.GetSqlChars(0);  
}  

Adatok lekérése a GetSqlBinary használatával

A GetSqlBinary metódus egy SqlDataReader esetén használható a varbinary(max) oszlop tartalmának lekérésére. 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())  
    {  
        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-val, GetBytes esetében szükséges a tömb pufferának mérete.

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 nevű objektumot, amely az első oszlop eltolásából bináris adatokat, majd a második oszlop eltolásából szöveges adatokat kér le.

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ípusokról CLR-típusokká

Egy varchar(max) vagy nvarchar(max) oszlop tartalmát bármelyik sztringkonvertálási módszerrel konvertálhatja, mint például ToString. Az alábbi kódrészlet feltételezi, hogy egy SqlDataReader nevű objektum reader kéri le az adatokat.

while (reader.Read())  
{  
     string str = reader[0].ToString();  
     Console.WriteLine(str);  
}  

Example

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 lefordításához egy hivatkozást kell megadni a System.Drawing névtérre. 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.

using Microsoft.Data.SqlClient;
using System.Data.SqlTypes;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

class Program
{
    static void Main()
    {
        // Supply any valid DocumentID value and file path.
        // The value 3 is supplied for DocumentID, and a literal
        // string for the file path where the image will be saved. 1, 60
        TestGetSqlBytes(7, @"c:\temp\");
        Console.ReadLine();
    }
    static private void TestGetSqlBytes(int documentID, string filePath)
    {
        // Assumes GetConnectionString returns a valid connection string.
        using (SqlConnection connection =
                   new SqlConnection(GetConnectionString()))
        {
            SqlCommand command = connection.CreateCommand();
            SqlDataReader reader = null;
            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 SqlParameter("@ProductPhotoID", SqlDbType.Int);
                paramID.Value = documentID;
                command.Parameters.Add(paramID);
                connection.Open();

                string photoName = null;

                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 Bitmap(bytes.Stream))
                            {
                                String 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
            {
                if (reader != null)
                    reader.Dispose();
            }
        }
    }

    static private string GetConnectionString()
    {
        // To avoid storing the connectionection string in your code, 
        // you can retrieve it from a configuration file, using the 
        // System.Configuration.ConfigurationSettings.AppSettings property 
        return "Data Source=(local);Initial Catalog=AdventureWorks;" +
            "Integrated Security=SSPI";
    }
}

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 a AdventureWorks2025 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  

Example

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.

using Microsoft.Data.SqlClient;
class Program
{
    static void Main()
    {
        // Supply any valid Document ID value.
        // The value 7 is supplied for demonstration purposes.
        string summaryString = GetDocumentSummary(7);
        Console.ReadLine();
    }
    static private string GetDocumentSummary(int documentID)
    {
        //Assumes GetConnectionString returns a valid connection string.
        using (SqlConnection connection =
                   new SqlConnection(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 SqlParameter("@DocumentID", SqlDbType.Int);
                paramID.Value = documentID;
                command.Parameters.Add(paramID);

                // Set up the output parameter to retrieve the summary.
                SqlParameter paramSummary =
                    new SqlParameter("@DocumentSummary",
                    SqlDbType.NVarChar, -1);
                paramSummary.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;
            }
        }
    }
    static private string GetConnectionString()
    {
        // To avoid storing the connectionection string in your code, 
        // you can retrieve it from a configuration file, using the 
        // System.Configuration.ConfigurationSettings.AppSettings property
        return "Data Source=(local);Initial Catalog=AdventureWorks;" +
            "Integrated Security=SSPI";
    }
}

Következő lépések