无法转换类型' Oracle.ManagedDataAccess.Types.OracleDecimal []'键入' System.IConvertible'

时间:2016-10-20 17:44:52

标签: c# oracle

我不确定如何解决此错误。

我有一个班级

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

我建立了一个List,然后打电话给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
                        };

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

您的参数构造代码正在提供一个数组作为参数的值。考虑这一行:

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

ToArray()的调用会立即获取结果 - 即使只有一个 - 并将其转换为数组。这与参数类型不同,因此执行转换的尝试失败。如果您确定只返回一条记录,请为该呼叫提供一个数组索引。