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 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.