OracleLob.Write(Byte[], Int32, Int32) Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Zapisuje sekwencję bajtów do bieżącego OracleLob strumienia i przesuwa bieżącą pozycję w tym strumieniu o liczbę zapisanych bajtów.
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[]
Tablica bajtów. Ta metoda kopiuje liczbę bajtów określonych w count
elemencie z buffer
do bieżącego strumienia.
- offset
- Int32
Przesunięcie bajtów na podstawie zera, w buffer
którym należy rozpocząć kopiowanie bajtów do bieżącego strumienia. W przypadku CLOB
typów danych i NCLOB
musi to być liczba parzysta.
- count
- Int32
Liczba bajtów do zapisania w bieżącym strumieniu. W przypadku CLOB
typów danych i NCLOB
musi to być liczba parzysta.
Wyjątki
Parametr buffer
jest odwołaniem o wartości null (Nothing
w Visual Basic).
Wartość w parametrze offset
lub count
nie jest dodatnia.
-lub-
Suma parametrów offset
i count
jest większa niż buffer
długość.
-lub-
Wartość określona w parametrze count
or offset
jest mniejsza niż zero lub większa niż 4 gigabajty.
-lub-
Należy określić CLOB
typy danych i NCLOB
jako liczbę parzysty bajtów.
Operacja nie znajduje się w ramach transakcji, OracleLob obiekt ma wartość null lub połączenie jest zamknięte.
Obiekt został zamknięty lub usunięty.
Wystąpił błąd Oracle.
Uwagi
Jeśli operacja zapisu zakończy się pomyślnie, pozycja w strumieniu jest zwiększana o liczbę zapisanych bajtów. Jeśli wystąpi wyjątek, pozycja w strumieniu pozostaje niezmieniona.
Zapis poza końcem LOB
jest dozwolony i powiększa LOB
liczbę zapisanych bajtów.
Dostawca danych .NET Framework dla programu Oracle obsługuje wszystkie CLOB
dane i NCLOB
jako Unicode. W związku z tym podczas uzyskiwania CLOB
dostępu do typów danych i NCLOB
zawsze masz do czynienia z liczbą bajtów, gdzie każdy znak wynosi 2 bajty. Jeśli na przykład ciąg tekstowy zawierający trzy znaki jest zapisywany jako na NCLOB
serwerze Oracle, na którym zestaw znaków wynosi 4 bajty na znak, a następnie wykonujesz operację Write
, określasz długość ciągu jako 6 bajtów, chociaż jest przechowywana jako 12 bajtów na serwerze.
Aby zapisać w LOB
pliku , musisz pobrać LOB
klauzulę USING FOR UPDATE w instrukcji SQL SELECT i musisz mieć uruchomioną transakcję lokalną.
W poniższym przykładzie pokazano, jak zapisywać dane w OracleLob obiektach:
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();
}
}
Uwaga
Operacja zapisu tylko LOB
do odczytu może zakończyć się powodzeniem, ale nie aktualizuje LOB
serwera. W takim przypadku jednak lokalna kopia obiektu LOB
jest aktualizowana. W związku z tym późniejsze operacje odczytu obiektu OracleLob mogą zwracać wyniki operacji zapisu.