Arithmetic operation resulted in an overflow (64-Bit Oracle.DataAccess)

Consider a table
Create Table T As Select 1/3 W From Dual;
With 64-Bit Oracle.DataAccess.dll you get an arithmetic overflow when trying to fetch the row with C#. The following code
using System;
using System.Data;
using System.Threading;
using System.Globalization;
using Oracle.DataAccess.Client;
class Program
{
   static void Main(string[] args)
   {
      Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en");
      OracleConnection Connection = null;
      try
      {
         DataTable T = new DataTable();
         Connection = new OracleConnection("Data Source=CDB;User Id=scott;Password=tiger");
         Connection.Open();
         new OracleDataAdapter("Select * From T",Connection).Fill(T);
      }
      catch(Exception ex)
      {
         Console.WriteLine(ex.Message);
         Console.WriteLine(ex.StackTrace);
         Connection.Close();
         Connection.Dispose();
      }
   }
}
results in
Arithmetic operation resulted in an overflow.
   at Oracle.DataAccess.Types.DecimalConv.GetDecimal(IntPtr numCtx)
   at Oracle.DataAccess.Client.OracleDataReader.GetDecimal(Int32 i)
   at Oracle.DataAccess.Client.OracleDataReader.GetValue(Int32 i)
   at Oracle.DataAccess.Client.OracleDataReader.GetValues(Object[] values)
   at System.Data.ProviderBase.SchemaMapping.LoadDataRow()
   at System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping)
   at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
   at System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
   at Oracle.DataAccess.Client.OracleDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
   at Program.Main(String[] args) in Program.cs:line 17
This contradicts the Oracle Data Provider for .NET Developer's Guide which says "The Oracle data type NUMBER can hold up to 38 precision, and the .NET Decimal type can hold up to 28 precision. If a NUMBER data type that has more than 28 precision is retrieved into a .NET Decimal type, it loses precision."
One workaround is to round the result before fetching it:
new OracleDataAdapter("Select ROUND(W,28) From T",Connection).Fill(T);
I read that Oracle won't change this behaviour but i didn't find the original statement.
Unfortunately with ODBC it also doesnt work. With
static void TestODBC()
{
   Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en");
   OdbcConnection Connection = null;
   try
   {
      DataTable T = new DataTable();
      Connection = new OdbcConnection("DSN=CDB;UID=scott;PWD=tiger");
      Connection.Open();
      new OdbcDataAdapter("Select ROUND(W,0) From T",Connection).Fill(T);
   }
   catch(Exception ex)
   {
      Console.WriteLine(ex.Message);
      Console.WriteLine(ex.StackTrace);
      Connection.Close();
      Connection.Dispose();
   }
}
we get
Arithmetic operation resulted in an overflow.
   at System.Data.Odbc.OdbcDataReader.FirstResult()
   at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader, Object[] methodArguments, SQL_API odbcApiMethod)
   at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader)
   at System.Data.Odbc.OdbcCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.Odbc.OdbcCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
   at Program.TestODBC() in Program.cs:line 37
But this is another issue (Oracle Bug 9793452) which is fixed with Oracle 12c. See the this MSDN-Blog.

Some more links:
Oracle-Thread 327112
Microsoft-Blog
ODP.NET docs says data loss can occur
Stefan-Taube.de