System.Data.Odbc.OdbcDataReader.GetBytes() always returns 0 when you use with ExecuteReader(CommandBehavior.SequentialAccess)
Consider a sample which reads an image from the SQL Server table (Adventure Works database), whose column is VARBINARY(MAX). The code sample goes like this,
Odbc.CommandText = "select ProductPhotoID,LargePhoto from Production.ProductPhoto where ProductPhotoID = '70'"
Dim dr As Odbc.OdbcDataReader = cm.ExecuteReader(CommandBehavior.SequentialAccess) à Happens with the ODBC SQL Server driver and the SQL Native client driver
Dim bufferSize As Int32 = 5000
Dim blob(bufferSize - 1) As Byte
Dim retval As Long = 0
Dim startIndex As Int64 = 0
retval = dr.GetBytes(1, startIndex, blob, 0, bufferSize)
With VS.NET 2003:
=================
retval = dr.GetBytes(1, startIndex, blob, 0, bufferSize)
The above statement always returns the right number of bytes and the image is properly fetched.
With VS.NET 2005:
=================
retval = dr.GetBytes(1, startIndex, blob, 0, bufferSize)
The above statement always returns 0.
When I change the Dim dr As Odbc.OdbcDataReader = cm.ExecuteReader(CommandBehavior.SequentialAccess) to CommandBehavior.CloseConnection then everything starts working.
When I use SqlClient everything works fine as expected.
RESOLUTION:
- This is a known issue with .NET 2.0 and it is fixed in VS 2008 SP 1.
- To work around the issue, either you've to use CommandBehavior.CloseConnection or use System.Data.SqlClient instead of System.Data.ODBC.