DataAdapter.Fill () генерирует исключение переполнения при загрузке больших десятичных значений

0

Я пытаюсь загрузить большие десятичные значения из базы данных MySQL и Oracle, что приводит к исключению. Я понимаю, что когда он пытается преобразовать значение в десятичный тип данных.Net, тогда это приводит к исключению, но каков способ чтения таких огромных значений из базы данных?

Исключение из базы данных MySQL

System.Number.ParseDecimal (значение String, NumberStyles, NumberFormatInfo numfmt) в System.Convert.ToDecimal (значение String, поставщик IFormatProvider) в MySql.Data.Types.MySqlDecimal.MySql.Data.Types.IMySqlValue.get_Value() в MySql.Data.MySqlClient.MySqlDataReader.GetValue(Int32 i) в MySql.Data.MySqlClient.MySqlDataReader.GetValues(Object [] values) в System.Data.ProviderBase.SchemaMapping.LoadDataRow() в System.Data.Common.DataAdapter.FillLoadDataRow (Сопоставление схемы) в System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue) в System.Data.Common.DataAdapter.Fill( DataTable [] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords) в System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable [] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand c ommand, поведение CommandBehavior) в System.Data.Common.DbDataAdapter.Fill(DataTable [] dataTables, Int32 startRecord, Int32 maxRecords, команда IDbCommand, поведение CommandBehavior) в System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)

Исключение из базы данных Oracle

Исправление System.OverflowException: арифметическая операция привела к переполнению. в Oracle.DataAccess.Types.DecimalConv.GetDecimal(IntPtr numCtx) в Oracle.DataAccess.Client.OracleDeadReader.GetDecimal(Int32 i) в Oracle.DataAccess.Client.OracleDataReader.GetValue(Int32 i) в Oracle.DataAccess.Client.OracleDataReader.GetValues(Object []) в System.Data.ProviderBase.SchemaMapping.LoadDataRow() в System.Data.Common.DataAdapter.FillLoadDataRow (сопоставление схемы) в System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue) в System.Data.Common.DataAdapter.Fill(DataTable [] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords) в Oracle.DataAccess.Client.OracleDataAdapter.Fill(DataTable [] dataTables, Int32 startRecord, Int32 maxRecords, команда IDbCommand, поведение CommandBehavior) в System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)

Вот мой пример кода в VB.Net

Using comm = createCommand(strSql, CommandType.Text,60)
   Using Da = _providerFactory.CreateDataAdapter
       Da.MissingSchemaAction = MissingSchemaAction.Add
       Da.SelectCommand = comm
       Da.SelectCommand.CommandTimeout = 60
       Dim dt As New DataTable
       Da.Fill(dt)                  
       Return dt
   End Using
End Using

Пример значения, которое я пытаюсь прочитать

+792281625142643375935439503351,000000000000000000000000000012

Я нашел различные другие ссылки, такие как этот для моей проблемы, но никто не работает для меня. Я открыт, чтобы читать значение как строку и делать конверсии позже.

Изменить 1:

Запросы базы данных не находятся под моим контролем, поэтому я не могу редактировать запросы, переданные клиентами. Кроме того, я предоставляю поддержку нескольких баз данных, таких как MySql, Oracle, DB2, Sqlite, Sqlserver и т.д., Используя заводской шаблон для создания DataAdapter, поэтому редактирование запросов нецелесообразно. Мой инструмент извлекает данные с помощью запросов, предоставляемых пользователями, и предоставляет результат в формате xml.

Изменить 2:

Я попытался использовать Java для извлечения данных, и resultset.getString("column_name") отлично работает, чтобы получать данные в виде String. У нас что-то подобное в.Net?

DataReader.GetString(), предоставленный в.Net, не работает.

  • 1
    Не могли бы вы опубликовать одно из этих больших значений? Таким образом, мы понимаем измерения, о которых мы говорим. Какие ссылки вы пробовали и какие у них были проблемы?
  • 0
    @DeveloperExceptionError: Вопрос обновлен.
Показать ещё 6 комментариев
Теги:
datatables

2 ответа

0

Насколько мне известно, сама.NET Framework не поддерживает эти большие десятичные значения в данный момент.

Но пользователь stackoverflow Gigo реализовал собственный вариант.NET Big Decimal (Исходный код). Это еще не класс производства, но он будет работать для большинства сценариев.

Я бы рекомендовал попробовать его вариант и сообщить о каких-либо проблемах в репозиторий, поэтому у них есть возможность исправить их.

  • 0
    Я думаю, что обращение не является острой проблемой для меня. Я не могу прочитать значение. Даже я пытался читать строку за строкой, используя Data reader и сохраняя результат как String, но затем также выдает ту же ошибку.
0

Поскольку значение слишком велико для чтения в формате.NET Decimal, вам нужно будет преобразовать его в строку в базе данных перед выполнением MySqlDataReader или с помощью MySqlDataAdapter для его чтения.

Измените свой SQL на:

SELECT CAST(BigDecimalValue AS CHAR), ... FROM table ...

Затем, когда вы прочитаете это значение, это будет String содержащая десятичные цифры. Вам нужно будет "прочитать значение как строку и сделать конверсии позже".

  • 0
    Запросы не находятся под моим контролем. Клиент запускает свои собственные запросы, используя мой инструмент.
  • 0
    @prem В этом случае я не знаю других обходных путей; поскольку столбец напечатан как DECIMAL , MySQL Connector / NET попытается прочитать его как decimal (затем потерпит неудачу, потому что он слишком большой).
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню