Unable to cast object of type 'Oracle.ManagedDataAccess.

本文关键字:Oracle ManagedDataAccess type to cast object of Unable | 更新日期: 2023-09-27 18:14:07

我不知道如何解决这个错误。

我有一个类

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[]' to type 'System.IConvertible'.

我不知道如何解决这个错误。

当我创建列表时,我有以下内容:

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

Unable to cast object of type 'Oracle.ManagedDataAccess.

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);
}

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

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

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