OracleLob.Write(Byte[], Int32, Int32) Méthode
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
É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 , LOB
vous 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.