gpt4 book ai didi

c# - DataAdapter.Fill() 在加载大的十进制值时抛出溢出异常

转载 作者:行者123 更新时间:2023-11-29 17:14:12 24 4
gpt4 key购买 nike

我试图从 MySQL 和 Oracle 数据库加载大的十进制值,这会导致异常。据我所知,当它尝试将值转换为 .Net 的十进制数据类型时,会导致异常,但是从数据库读取如此巨大的值的方法是什么?

MySQL 数据库异常

System.Number.ParseDecimal(String value, NumberStyles options, NumberFormatInfo numfmt) at System.Convert.ToDecimal(String value, IFormatProvider provider) at MySql.Data.Types.MySqlDecimal.MySql.Data.Types.IMySqlValue.get_Value() at MySql.Data.MySqlClient.MySqlDataReader.GetValue(Int32 i) at MySql.Data.MySqlClient.MySqlDataReader.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 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)

Oracle数据库异常

System.OverflowException: 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)

这是我在 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

我发现了各种其他链接,例如 this一个解决我的问题,但没有一个对我有用。我愿意将值作为字符串读取并稍后进行转换。

编辑1:

数据库查询不受我的控制,因此我无法编辑客户端传递的查询。此外,我还使用工厂模式创建 DataAdapter 来提供对 MySql、Oracle、DB2、Sqlite、Sqlserver 等多个数据库的支持,因此编辑查询是不可行的。我的工具使用用户提供的查询来获取数据,并以 xml 格式提供输出。

编辑2:

我尝试使用Java来获取数据,resultset.getString("column_name")工作正常,可以以字符串形式获取数据。 .Net 中有类似的东西吗?

.Net 中提供的 DataReader.GetString() 不起作用。

最佳答案

据我所知,.NET Framework 本身目前不支持那么大的十进制值。

但是 stackoverflow 用户 Gigo实现了自定义.NET Big Decimal variant (Source code)。它还不是生产级别,但适用于大多数场景。

我建议尝试他的变体并向存储库报告任何问题,以便他们能够修复它们。

关于c# - DataAdapter.Fill() 在加载大的十进制值时抛出溢出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51727572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com