2010-07-22 2 views
2

모든 Oracle 테이블에서 단일 행을 받고 아래 코드를 사용하여 DataGridview에 표시하는 일반적인 방법을 사용하고 있습니다. 그러나 테이블에 부동 소수점 유형의 열이 포함되어 있고 값에 소수 자리가 많으면 다음 행에서 "산술 연산 결과 오버플로가 발생합니다."라는 메시지가 나타납니다. 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.Client.OracleDataReader.GetDecimal에서 Oracle.DataAccess.Types.DecimalConv.GetDecimal (numCtx을 IntPtr) Oracle.DataAccess.Client에서 (INT32 I)에서 . OracleDataReader.GetValue Oracle.DataAccess.Client.OracleDataReader.GetValues에서 (INT32 I) (개체 []의 값)이 에러를 (그것이 소수 변환 가정습니다) 일으키는 이유

그래서 I 보시; 그러나 나는 이것을 어떻게 얻을 수 있습니까?

I 명시 적으로 데이터를로드하기 전에 열 유형을 설정하려 :.

dgvStagingTable.Columns [ "TR_THROUGHPUT_TIME_NO"] = 치형 대해서 typeof (문자열);

등 여러 가지 유형이 있지만 차이점은 없습니다.

도움을 주시면 감사하겠습니다.

답변

1

처음에는 OracleDbTypeEx (http://download.oracle.com/docs/html/E15167_01/OracleParameterClass.htm#CHDJHDGE)를 사용하여이 문제를 해결할 것을 제안했지만 이는 잘못된 제안이었습니다.

내가 한 그래서 뭐 :

Create Table Testdecimalteable(
    Acol number(10) , 
    DecCol NUMBER(38,38) 
); 
/

Insert Into Testdecimalteable 
Select level,Level/(power(2,level)) 
    From Dual 
    Connect By Level < 100 ; 

/

Create or replace Procedure Testprocdecimal(Crs OUT Sys_Refcursor) 
AS 
Begin 
    Open Crs For 
    Select * 
     FROM Testdecimalteable ; 
END Testprocdecimal ; 

지금이 그물을 넘어 것으로 알려진 일부 데이터를 얻을 것이다.

다음 .NET 측면 :

OracleConnection _conn = new OracleConnection(""); 
    _conn.Open(); 
    OracleCommand oCmd = new OracleCommand(); 
    oCmd.CommandText = "Testprocdecimal"; 

    oCmd.CommandType = CommandType.StoredProcedure; 
    oCmd.Connection = _conn; 

    OracleParameter crs = new OracleParameter(); 
    crs.OracleDbType = OracleDbType.RefCursor ; 
    crs.Direction = ParameterDirection.Output; 
    crs.ParameterName = "crs"; 
    oCmd.Parameters.Add(crs); 
    using (OracleDataReader MyReader = oCmd.ExecuteReader()) 
    { 
     int ColumnCount = MyReader.FieldCount; 
     // get the data and add the row 
     while (MyReader.Read()) 
     { 
      //MyReader.GetOracleValue(1).ToString() 
      Console.WriteLine(string.Format("{0}/{1}", MyReader.GetValue(0),MyReader.GetOracleValue(1).ToString() )); 


     } 
    } 

이 문자열에 이르기까지 모든 변환했지만 작동합니다. 난 그냥 다시 한 번 당신의 초기 쿼리를 통해 보았다

http://download-east.oracle.com/docs/html/A96160_01/features.htm#1048038

, 당신은 두 번 쿼리를 호출 :

oCmd.ExecuteNonQuery(); 
... 
using (OracleDataReader MyReader = oCmd.ExecuteReader()) 

당신이 ExecuteNonQuery는 필요하지 않습니다; ExecuteReader가 sp를 실행합니다

+0

두 번 호출되는 쿼리를 지적 해 주셔서 감사합니다. 그리고 당신의 소품 솔루션이 효과가있었습니다; 나는 단순히 .GetOracleValue (i) .ToString()을 사용하여 datagridview에 추가하기 전에 배열을 고치기 만하면된다. 다시 감사합니다. D. – ValiantBoy

관련 문제