OracleLob.Write(Byte[], Int32, Int32) Metoda
Definicja
Ważny
Niektóre informacje dotyczą produktów przedpremierowych, które mogą zostać znacznie zmodyfikowane przed premierą. Microsoft nie udziela żadnych gwarancji, ani wyraźnych, ani domniemanych, dotyczących informacji podanych tutaj.
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 LOBpliku , 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.