2016-10-20 51 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

​​は、単一の値ではなく値のリストを返します。

あなたは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

この場合、ストアされたproc 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()への呼び出しは、すぐに結果を取る - 一つだけがあっても - と、配列に変換します。これはパラメータタイプと似ていないため、変換を実行しようとする試みが失敗します。 1つのレコードしか返さない場合は、呼び出しに配列インデックスを指定します。

+0

Oracle.ManagedDataAccess.Types.OracleDecimal [] ID = records.Select(x => x.ID).ToArray();と同じですか? – PrivateJoker

関連する問題