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

Definition

Skriver en sekvens med byte till den aktuella OracleLob strömmen och avancerar den aktuella positionen i den här strömmen med antalet skrivna byte.

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)

Parametrar

buffer
Byte[]

En matris med byte. Den här metoden kopierar antalet byte som anges i count från buffer till den aktuella strömmen.

offset
Int32

Den nollbaserade byteförskjutningen buffer där byte ska börja kopieras till den aktuella strömmen. För CLOB och NCLOB datatyper måste detta vara ett jämnt tal.

count
Int32

Antalet byte som ska skrivas till den aktuella strömmen. För CLOB och NCLOB datatyper måste detta vara ett jämnt tal.

Undantag

Parametern buffer är en nullreferens (Nothing i Visual Basic).

Ett värde i parametern offset eller count är inte positivt.

-eller-

Summan av parametrarna offset och count är större än buffer längden.

-eller-

Ett värde som anges i parametern count eller offset är mindre än noll eller större än 4 gigabyte.

-eller-

Du måste ange CLOB och NCLOB datatyper som ett jämnt antal byte.

Åtgärden är inte inom en transaktion, objektet OracleLob är null eller så stängs anslutningen.

Objektet stängdes eller togs bort.

Ett Oracle-fel har inträffat.

Kommentarer

Om skrivåtgärden lyckas går positionen i dataströmmen framåt med antalet skrivna byte. Om ett undantag inträffar förblir positionen i dataströmmen oförändrad.

Att skriva bortom slutet av LOB tillåts och förstoras med LOB antalet skrivna byte.

.NET Framework Data Provider för Oracle hanterar alla CLOB och NCLOB data som Unicode. När du använder CLOB och NCLOB datatyper hanterar du därför alltid antalet byte, där varje tecken är 2 byte. Om till exempel en textsträng som innehåller tre tecken sparas som en NCLOB på en Oracle-server där teckenuppsättningen är 4 byte per tecken och du utför en Write åtgärd anger du längden på strängen som 6 byte, även om den lagras som 12 byte på servern.

Om du vill skriva till LOBmåste du ha hämtat LOB med hjälp av FOR UPDATE-satsen i SQL SELECT-instruktionen och du måste ha en lokal transaktion igång.

I följande exempel visas hur du skriver till 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();
    }
}

Note

En skrivåtgärd till en skrivskyddad LOB kan lyckas, men uppdaterar LOB inte på servern. I det här fallet uppdateras dock den lokala kopian av den LOB . Därför kan senare läsåtgärder på OracleLob objektet returnera resultatet av skrivåtgärden.

Gäller för