Udostępnij za pośrednictwem


OracleLob.Write(Byte[], Int32, Int32) Metoda

Definicja

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.

Dotyczy