Share via


OracleLob.Write(Byte[], Int32, Int32) Metoda

Definice

Zapíše posloupnost bajtů do aktuálního OracleLob datového proudu a posune aktuální pozici v tomto streamu o počet zapsaných bajtů.

public:
 override void Write(cli::array <System::Byte> ^ buffer, int offset, int count);
public override void Write (byte[] buffer, int offset, int count);
override this.Write : byte[] * int * int -> unit
Public Overrides Sub Write (buffer As Byte(), offset As Integer, count As Integer)

Parametry

buffer
Byte[]

Pole bajtů. Tato metoda zkopíruje počet bajtů zadaných v count z buffer do aktuálního datového proudu.

offset
Int32

Posun bajtů založený na nule, při buffer kterém se mají začít kopírovat bajty do aktuálního datového proudu. U CLOB datových typů a NCLOB musí jít o sudé číslo.

count
Int32

Počet bajtů, které se mají zapsat do aktuálního datového proudu. U CLOB datových typů a NCLOB musí jít o sudé číslo.

Výjimky

Parametr buffer je odkaz s hodnotou null (Nothing v jazyce Visual Basic).

Hodnota v parametru offset nebo count není kladná.

-nebo-

Součet offset parametrů a count je větší než buffer délka.

-nebo-

Hodnota zadaná v parametru count nebo offset je menší než nula nebo větší než 4 gigabajty.

-nebo-

Datové typy a NCLOB musíte zadat CLOB jako sudý počet bajtů.

Operace není v rámci transakce, OracleLob objekt má hodnotu null nebo je připojení uzavřeno.

Objekt byl uzavřen nebo odstraněn.

Došlo k chybě Oracle.

Poznámky

Pokud je operace zápisu úspěšná, pozice v datovém proudu se posune o počet zapsaných bajtů. Pokud dojde k výjimce, zůstane pozice v rámci datového proudu beze změny.

Psaní za koncem LOB je povoleno a zvětšuje LOB počet zapsaných bajtů.

Zprostředkovatel dat rozhraní .NET Framework pro Oracle zpracovává všechna CLOB data a NCLOB jako Unicode. Proto při přístupu k datovým typům CLOB a NCLOB datovým typům vždy pracujete s počtem bajtů, kde každý znak má 2 bajty. Pokud je například řetězec textu obsahující tři znaky uložen jako NCLOB řetězec na serveru Oracle, kde je znaková sada 4 bajty na znak, a provedete Write operaci, zadáte délku řetězce jako 6 bajtů, i když je na serveru uložen jako 12 bajtů.

Chcete-li zapisovat do LOBpříkazu , musíte mít načtenou LOB klauzuli pomocí klauzule FOR UPDATE v příkazu SQL SELECT a musíte mít spuštěnou místní transakci.

Následující příklad ukazuje, jak zapisovat do OracleLob objektů:

public static void WriteLobExample(OracleCommand command)  
{  
    // Note: Updating LOB data requires a transaction.  
    command.Transaction = command.Connection.BeginTransaction();  
    // Select some data.  
    //    Table Schema:  
    //        "CREATE TABLE tablewithlobs (a int, b BLOB, c BLOB)";  
    //        "INSERT INTO tablewithlobs values (1, 'AA', 'AAA')";  
    command.CommandText = "SELECT * FROM TableWithLobs FOR UPDATE";  
    OracleDataReader reader = command.ExecuteReader();  
    using(reader)  
    {  
        // Obtain the first row of data.  
        reader.Read();  
        // Obtain both LOBs.  
        OracleLob BLOB1 = reader.GetOracleLob(1);  
        OracleLob BLOB2 = reader.GetOracleLob(2);  
        // Perform any desired operations on the LOB, (read, position, and so on).  
        // ...  
        // Example - Writing binary data (directly to the backend).  
        // To write, you can use any of the stream classes, or write raw binary data using   
        // the OracleLob write method. Writing character vs. binary is the same;  
        // however note that character is always in terms of Unicode byte counts  
        // (for example: even number of bytes - 2 bytes for every Unicode character).  
        var buffer = new byte[100];  
        buffer[0] = 0xCC;  
        buffer[1] = 0xDD;  
        BLOB1.Write(buffer, 0, 2);  
        BLOB1.Position = 0;  
        Console.WriteLine(BLOB1.LobType + ".Write(" + buffer + ", 0, 2) => " + BLOB1.Value);  

        // Example - Copying data into another LOB.  
        long actual = BLOB1.CopyTo(BLOB2);  
        Console.WriteLine(BLOB1.LobType + ".CopyTo(" + BLOB2.Value + ") => " + actual);  

        // Commit the transaction now that everything succeeded.  
        // Note: On error, Transaction.Dispose is called (from the using statement)  
        // and will automatically roll-back the pending transaction.  
        command.Transaction.Commit();  
    }  
}  

Poznámka

Operace zápisu jen pro čtení LOB může být úspěšná, ale neaktualizuje LOB na serveru. V tomto případě se ale místní kopie LOB aktualizuje. Proto pozdější operace čtení u objektu OracleLob můžou vrátit výsledky operace zápisu.

Platí pro