2016-10-20 2 views
0

이 오류를 해결하는 방법을 모르겠습니다.'Oracle.ManagedDataAccess.Types.OracleDecimal []'유형의 객체를 'System.IConvertible'유형으로 변환 할 수 없습니다.

나는 클래스

public class MyClass 
{ 
    public OracleDecimal ID { get; set; } 
    public string FIELD1 { get; set; } 
    public string FIELD2 { get; set; } 
    public OracleDate FIELD3 { get; set; } 
} 

내가 다음 SP로 전화를 걸 목록을 내장에게 있습니다.

 OracleParameter p_ID = new OracleParameter("p_ID", OracleDbType.Decimal, records.Select(x => x.ID).ToArray(), ParameterDirection.Input); 
     OracleParameter p_FIELD1 = new OracleParameter("p_FIELD1", OracleDbType.Varchar2, records.Select(x => x.FIELD1).ToArray(), ParameterDirection.Input); 
     OracleParameter p_FIELD2 = new OracleParameter("p_FIELD2", OracleDbType.Varchar2, records.Select(x => x.FIELD2).ToArray(), ParameterDirection.Input); 
     OracleParameter p_FIELD3 = new OracleParameter("p_FIELD3", OracleDbType.Date, records.Select(x => x.FIELD3).ToArray(), ParameterDirection.Input); 

     var result = context.Database.ExecuteSqlCommand("BEGIN MY_PACKAGE.MY_PROC(:p_ID, :p_FIELD1, :p_FIELD2, :p_FIELD3); END;", p_ID, p_FIELD1, p_FIELD2, p_FIELD3); 

그러나 나는 'Oracle.ManagedDataAccess.Types.OracleDecimal은 []' 'System.IConvertible'입력 유형의 개체를 캐스팅 할 수 없습니다 오류 를 얻을.

이 오류를 해결하는 방법을 모르겠습니다. 내 목록을 만들 때

나는 다음과 같습니다

OracleDate myDate = new OracleDate(DateTime.Now); 
var myRecord = new MyClass 
         { 
          ID = ((OracleDecimal)ID).Value, 
          FIELD1 = field1, 
          FIELD2 = field2, 
          FIELD3 = myDate 
         }; 

어떤 제안을 감상 할 수있다.

답변

0

records.Select(x => ...)은 단일 값이 아닌 값 목록을 반환합니다.

당신은 foreach 루프 주위에 당신의 코드를 포장한다 : 당신의 매개 변수 건축 코드는 매개 변수의 값으로 배열을 공급

foreach(var record in records) 
{ 
    OracleParameter p_ID = new OracleParameter("p_ID", OracleDbType.Decimal, record.Id, ParameterDirection.Input); 
    OracleParameter p_FIELD1 = new OracleParameter("p_FIELD1", OracleDbType.Varchar2, record.FIELD1, ParameterDirection.Input); 
    OracleParameter p_FIELD2 = new OracleParameter("p_FIELD2", OracleDbType.Varchar2, records.FIELD2, ParameterDirection.Input); 
    OracleParameter p_FIELD3 = new OracleParameter("p_FIELD3", OracleDbType.Date, records.FIELD3, ParameterDirection.Input); 

    var result = context.Database.ExecuteSqlCommand("BEGIN MY_PACKAGE.MY_PROC(:p_ID, :p_FIELD1, :p_FIELD2, :p_FIELD3); END;", p_ID, p_FIELD1, p_FIELD2, p_FIELD3); 
} 
+0

이 경우 저장된 프로 시저 x 번을 호출합니다. proc가 한 번만 호출되도록 proc에 데이터 배열을 전달하려고합니다. – PrivateJoker

+0

@ JDS 그런 다음 프로 시저 서명을 업데이트해야합니다. 지금과 같이 프로 시저는 하나의 값만 인수로 취할 수 있으며 목록은 아닙니다. –

+0

설명해 주셔서 감사합니다. 서명을 변경 했으므로 SP를 한 번 호출하고 3000 레코드를 0.24 초에 삽입 할 수 있습니다. – PrivateJoker

0

. 이 라인을 고려

OracleParameter p_ID = new OracleParameter("p_ID", OracleDbType.Decimal, records.Select(x => x.ID).ToArray(), ParameterDirection.Input); 

ToArray()에 대한 호출은 즉시 결과를 소요 -이 하나만있는 경우에도 - 그리고 배열로 바뀝니다. 이는 매개 변수 유형과 다르므로 변환을 수행하려는 시도가 실패합니다. 하나의 레코드 만 반환하면 호출에 배열 인덱스를 제공하십시오.

+0

Oracle.ManagedDataAccess.Types.OracleDecimal [] ID = records.Select (x => x.ID) .ToArray(); – PrivateJoker

관련 문제