Я пытаюсь загрузить большие десятичные значения из базы данных 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, не работает.
Насколько мне известно, сама.NET Framework не поддерживает эти большие десятичные значения в данный момент.
Но пользователь stackoverflow Gigo реализовал собственный вариант.NET Big Decimal (Исходный код). Это еще не класс производства, но он будет работать для большинства сценариев.
Я бы рекомендовал попробовать его вариант и сообщить о каких-либо проблемах в репозиторий, поэтому у них есть возможность исправить их.
Поскольку значение слишком велико для чтения в формате.NET Decimal
, вам нужно будет преобразовать его в строку в базе данных перед выполнением MySqlDataReader
или с помощью MySqlDataAdapter
для его чтения.
Измените свой SQL на:
SELECT CAST(BigDecimalValue AS CHAR), ... FROM table ...
Затем, когда вы прочитаете это значение, это будет String
содержащая десятичные цифры. Вам нужно будет "прочитать значение как строку и сделать конверсии позже".
DECIMAL
, MySQL Connector / NET попытается прочитать его как decimal
(затем потерпит неудачу, потому что он слишком большой).