我正在使用通用方法从任何Oracle表中接收单个行,并使用下面的代码将其显示在datagridview中。但是,如果表中包含一个float类型的列,并且该值具有大量的小数位数,则会在下面的代码行中得到“算术运算导致溢出”:MyReader.GetValues(objCells);在C#中,我该如何处理Oracle Float类型?接收错误“算术运算导致溢出”
oCmd.CommandText = "OTCMIADM.OTCMI_GUI.GET_ROW";
oCmd.CommandType = CommandType.StoredProcedure;
oCmd.Parameters.Add("PI_TABLE_NAME", OracleDbType.Varchar2, 40).Value = cmbStagingTables.SelectedItem;
oCmd.Parameters.Add("PI_ROWID", OracleDbType.Varchar2, 40).Value = txtRowID.Text;
oCmd.Parameters.Add(new OracleParameter("PIO_CURSOR", OracleDbType.RefCursor)).Direction = ParameterDirection.Output;
oCmd.ExecuteNonQuery();
// clear the datagrid in preperation for loading
dgvStagingTable.Columns.Clear();
dgvStagingTable.Rows.Clear();
using (OracleDataReader MyReader = oCmd.ExecuteReader())
{
int ColumnCount = MyReader.FieldCount;
// add the column headers
DataGridViewColumn[] columns = new DataGridViewColumn[ColumnCount];
for (int i = 0; i < columns.Length; ++i)
{
DataGridViewColumn column = new DataGridViewTextBoxColumn();
column.FillWeight = 1;
column.HeaderText = MyReader.GetName(i);
column.Name = MyReader.GetName(i);
columns[i] = column;
}
dgvStagingTable.Columns.AddRange(columns);
// get the data and add the row
while (MyReader.Read())
{
//get all row values into an array
object[] objCells = new object[ColumnCount];
MyReader.GetValues(objCells);
//add array as a row to grid
dgvStagingTable.Rows.Add(objCells);
}
}
堆栈跟踪显示: 在Oracle.DataAccess.Types.DecimalConv.GetDecimal(IntPtr的numCtx) 在Oracle.DataAccess.Client.OracleDataReader.GetDecimal(的Int32ⅰ) 在Oracle.DataAccess.Client。 OracleDataReader.GetValue(的Int32 I) 在Oracle.DataAccess.Client.OracleDataReader.GetValues(Object []对象的值)
所以我能看到为什么它导致错误(这是假设十进制转换);但我该如何解决这个问题?
我试图与加载数据之前明确设置的列的类型:
dgvStagingTable.Columns [ “TR_THROUGHPUT_TIME_NO”]的ValueType = typeof运算(字符串);
和其他几种类型,但没有任何区别。
任何帮助表示赞赏。
感谢您指出被调用两次的查询。 你提出的解决方案工作;我简单地使用.GetOracleValue(i).ToString()在添加到datagridview之前对数组进行填充,作为一种享受! 再次感谢, D. – ValiantBoy 2010-07-23 12:31:45