Partager via


OracleLob.Write(Byte[], Int32, Int32) Méthode

Définition

Écrit une suite d'octets dans le flux OracleLob actuel et avance la position actuelle dans ce flux du nombre d'octets écrits.

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)

Paramètres

buffer
Byte[]

Tableau d'octets. Cette méthode copie le nombre d'octets spécifié dans count à partir de buffer dans le flux actuel.

offset
Int32

Dans buffer, décalage d'octet de base zéro auquel commencer la copie des octets dans le flux actuel. Pour les types de données CLOB et NCLOB, il doit s'agir d'un nombre pair.

count
Int32

Nombre d'octets à écrire dans le flux actuel. Pour les types de données CLOB et NCLOB, il doit s'agir d'un nombre pair.

Exceptions

Le paramètre buffer est une référence null (Nothing en Visual Basic).

Une valeur du paramètre offset ou count n'est pas positive.

- ou -

La somme des paramètres offset et count est supérieure à la longueur de buffer.

- ou -

Une valeur spécifiée dans le paramètre count ou offset est inférieure à zéro ou supérieure à 4 giga-octets.

- ou -

Vous devez spécifier les types de données CLOB et NCLOB en tant que nombre d'octets pair.

L'opération ne fait pas partie d'une transaction, l'objet OracleLob est de type null ou la connexion est fermée.

L'objet était fermé ou supprimé.

Une erreur Oracle s'est produite.

Remarques

Si l’opération d’écriture réussit, la position dans le flux avance par le nombre d’octets écrits. Si une exception se produit, la position dans le flux reste inchangée.

L’écriture au-delà de la fin de LOB est autorisée et agrandit le LOB par le nombre d’octets écrits.

Le fournisseur de données .NET Framework pour Oracle gère toutes les CLOB données et NCLOB en unicode. Par conséquent, lorsque vous accédez aux CLOB types de données et NCLOB , vous devez toujours traiter le nombre d’octets, où chaque caractère est de 2 octets. Par exemple, si une chaîne de texte contenant trois caractères est enregistrée en tant que NCLOB sur un serveur Oracle où le jeu de caractères est de 4 octets par caractère et que vous effectuez une Write opération, vous spécifiez la longueur de la chaîne sous la forme de 6 octets, bien qu’elle soit stockée sous forme de 12 octets sur le serveur.

Pour écrire dans , LOBvous devez avoir récupéré le à l’aide de LOB la clause FOR UPDATE dans l’instruction SQL SELECT, et vous devez avoir une transaction locale démarrée.

L’exemple suivant montre comment écrire dans des OracleLob objets :

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();  
    }  
}  

Notes

Une opération d’écriture dans une lecture seule LOB peut réussir, mais ne met pas à jour sur LOB le serveur. Dans ce cas, toutefois, la copie locale du LOB est mise à jour. Par conséquent, les opérations de lecture ultérieures sur l’objet OracleLob peuvent retourner les résultats de l’opération d’écriture.

S’applique à