OracleLob.Write(Byte[], Int32, Int32) Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
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 LOB
pří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.