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

Définition

Lit une séquence d'octets à partir du flux OracleLob actuel et avance la position dans le flux du nombre d'octets lus.

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

Paramètres

buffer
Byte[]

Tableau d'octets. Lorsque cette méthode est retournée, la mémoire tampon contient le tableau d’octets spécifié dont les valeurs comprises entre offset et (offset + count) sont remplacées par les octets lus dans la source en cours.

offset
Int32

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

count
Int32

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

Retours

Nombre total d'octets lus dans la mémoire tampon. Ceci peut être inférieur au nombre d'octets demandé si ce nombre n'est pas actuellement disponible ou égal à zéro (0) si la fin du flux a été atteinte.

Exceptions

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 la mémoire tampon.

- ou -

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

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

La Read méthode lit un maximum d’octets count du flux actuel et les stocke dans à buffer partir offsetde . La position actuelle dans le flux est avancée par le nombre d’octets lus ; Toutefois, si une exception se produit, la position actuelle dans le flux reste inchangée. Read retourne le nombre d’octets lus. La valeur de retour est égale à zéro uniquement si la position se trouve actuellement à la fin du flux. Read se bloque jusqu’à ce qu’au moins un octet de données puisse être lu, dans le cas où aucune donnée n’est disponible.Read retourne 0 si vous tentez de lire à partir d’un LOB lorsque la position actuelle se trouve à la fin de LOB. Read peut retourner moins d’octets que demandé même si la fin du flux n’a pas été atteinte.

Le fournisseur de données .NET Framework pour Oracle gère toutes les CLOB données et NCLOB au format Unicode. Par conséquent, lors de l’accès aux CLOB types de données et NCLOB , vous avez toujours affaire au 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 Read opération, vous spécifiez la longueur de la chaîne sous la forme de 6 octets, bien qu’elle soit stockée sous la forme de 12 octets sur le serveur.

L’exemple suivant montre comment lire OracleLob des objets.

public static void ReadLobExample(OracleCommand command)  
{  
    int actual = 0;  

    // Select some data.  
    // Table Schema:  
    //  "CREATE TABLE TableWithLobs (a int, b BLOB, c CLOB, d NCLOB)";  
    //  "INSERT INTO TableWithLobs values (1, 'AA', 'AAA', N'AAAA')";  
    command.CommandText = "SELECT * FROM TableWithLobs";  
    OracleDataReader reader = command.ExecuteReader();  
    using(reader)  
    {  
        // Obtain the first row of data.  
        reader.Read();  
        // Obtain the LOBs (all 3 varieties).  
        OracleLob BLOB = reader.GetOracleLob(1);  
        OracleLob CLOB  = reader.GetOracleLob(2);  
        OracleLob NCLOB = reader.GetOracleLob(3);  

        // Example - Reading binary data (in chunks).  
        var buffer = new byte[100];  
        while((actual = BLOB.Read(buffer, 0, buffer.Length)) > 0)  
            Console.WriteLine(BLOB.LobType + ".Read(" + buffer + ", " + buffer.Length + ") => " + actual);  

        // Example - Reading CLOB/NCLOB data (in chunks).  
        // Note: You can read character data as raw Unicode bytes (using OracleLob.Read as in the above example).  
        // However, because the OracleLob object inherits directly from the.NET stream object,   
        // all the existing classes that manipulate streams can also be used. For example, the   
        // .NET StreamReader makes converting the raw bytes into actual characters easier.  
        var streamreader = new StreamReader(CLOB, Encoding.Unicode);  
        var cbuffer = new char[100];  
        while((actual = streamreader.Read(cbuffer, 0, cbuffer.Length)) >0)  
            Console.WriteLine(CLOB.LobType + ".Read(" + new string(cbuffer, 0, actual) + ", " + cbuffer.Length + ") => " + actual);  

        //Example - Reading data (all at once).  
        //You could use StreamReader.ReadToEnd to obtain all the string data,or simply  
        //call OracleLob.Value to obtain a contiguous allocation of all the data.  
        Console.WriteLine(NCLOB.LobType + ".Value => " + NCLOB.Value);  
    }  
}  

Vous pouvez construire un qui a la OracleLob valeur NULL en utilisant ce format :

OracleLob myLob = OracleLob.Null;  

Cette technique est principalement utilisée pour tester si un LOB retourné à partir du serveur a la valeur NULL, comme l’illustre l’exemple suivant.

if (myLob == OracleLob.Null)  

Une valeur NULL LOB se comporte de la même façon qu’un octet zéro LOB dans qui Read réussit et retourne toujours zéro octet.

S’applique à