Forum Stats

  • 3,733,718 Users
  • 2,246,810 Discussions
  • 7,856,856 Comments

Discussions

Reading OracleBlob throws exception when InitialLOBFetchSize is > 0

User_5RTMF
User_5RTMF Member Posts: 5
edited November 2020 in ODP.NET

Hello,

using ODP.NET, I'm having issue when reading blob field as stream (using GetOracleBlob),

I don't know where to report a bug, so putting it here.


i'm using Oracle.ManagedDataAccess Nuget package version 19.10.0 (latest)

1. Have InitialFetchLOBSize is > 0

2. get blob stream with 'GetOracleBlob'

3. read first N bytes, but less than InitialFetchLOBSize

4. then read next portion of bytes, which would go over InitialFetchLOBSize cached bytes.

 

Result:

it throws exception

"Source array was not long enough. Check srcIndex and length, and the array's lower bounds."

  at System.Array.Copy(Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length, Boolean reliable)

  at System.Array.Copy(Array sourceArray, Int64 sourceIndex, Array destinationArray, Int64 destinationIndex, Int64 length)

  at OracleInternal.ServiceObjects.OracleBlobImpl.Read(Int64 locatorOffset, Int64 numBytesToRead, Int64 outBufferOffset, Byte[]& outBuffer)

  at Oracle.ManagedDataAccess.Types.OracleBlob.Read(Byte[] buffer, Int32 offset, Int32 count)


To give example with specific numbers:

- InitialFetchLOBSize=32,

- read first 16 bytes (or any number under 32, or you can just set Position to 16, or 31, doesn't matter)

- read next 32 bytes (so requested data chunk will read some of already cached data and some new)


sample code:

command.CommandText = @"select BLOB from table";

command.InitialLOBFetchSize = 32;

var reader = command.ExecuteReader()) {

while (reader.Read()) {

  if (reader.IsDBNull(0)) continue;

  using (var blob = reader.GetOracleBlob(0)) {

    blob.Position = 16;

    // this will throw exception

    blob.Read(buffer, 0, 64);

  }

}

Best Answer

Answers

Sign In or Register to comment.