oracle强制更新type,无法将类型为'Oracle.ManagedDataAccess.Types.OracleDecimal []'的对象强制转换为'System.IConvertible'(...

无法将类型为'Oracle.ManagedDataAccess.Types.OracleDecimal []'的对象强制转换为'System.IConvertible'(Unable to cast object of type 'Oracle.ManagedDataAccess.Types.OracleDecimal[]' to type '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; }

}

我建立了一个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

};

任何建议,将不胜感激。

I am not sure how to resolve this error.

I have a class

public class MyClass

{

public OracleDecimal ID { get; set; }

public string FIELD1 { get; set; }

public string FIELD2 { get; set; }

public OracleDate FIELD3 { get; set; }

}

I built a List then make a call to the 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);

However I get the error Unable to cast object of type 'Oracle.ManagedDataAccess.Types.OracleDecimal[]' to type 'System.IConvertible'.

I'm not sure how to resolve this error.

When I create my list I have the following:

OracleDate myDate = new OracleDate(DateTime.Now);

var myRecord = new MyClass

{

ID = ((OracleDecimal)ID).Value,

FIELD1 = field1,

FIELD2 = field2,

FIELD3 = myDate

};

Any suggestions would be appreciated.

原文:https://stackoverflow.com/questions/40161128

更新时间:2020-05-31 19:05

最满意答案

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

}

records.Select(x => ...) will return a list of values, not a single value.

You should wrap your code around a foreach loop:

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

}

2016-10-20

相关问答

哇!! 得到了答案。 测试解决方案: public static void FiletoSql(MemoryStream fileToPut, MySqlConnection con)

{

byte[] data = fileToPut.ToArray();

try

{

const string preparedCommand =

@"update user_account_statem

...

您正在尝试将DropDownList本身转换为Int32而不是其值。 您应该进一步向下钻取控件以在转换之前检索该值。 例如, currentCategoryID = Convert.ToInt32(((DropDownList)r.FindControl("DDLCategories")).SelectedItem.Value);

You're trying to convert the DropDownList itself to an Int32 rather than its value.

...

ListViewItem无法转换为整数。 您应该将项目文本转换回int或使用它的Tag属性来保持项目的整数值。 第一种方法: foreach(ListViewItem selectedItem in listView1.SelectedItems)

{

string text = selectedItem.Text;

simIdElements.Add(Convert.ToInt32(text));

}

第二种方法: for (int i = 0; i < simIdCell

...

下面这些行会导致异常,因为当您传递int[]数组的值时(也不默认使用数组绑定), OracleCommand参数需要int数据类型。 command.Parameters.Add("@USERID", OracleDbType.Int32);

command.Parameters[0].Value = arrUID;

如果您只想传递单个元素,请使用数组索引号来分配值。 command.Parameters[0].Value = arrUID[0];

但是,如果要将整个数组内容传递到存储过程参数

...

你有没有尝试懒加载包括? var product = DbEntities.Products.FirstOrDefault(p => p.Id == id);

product.Images.Load();

// ... and so on

这可能是内容丰富的。 这也是一个已知的问题 。 我不确定目前是否有已知的分辨率。 如果有我无法找到它。 Have you tried lazy loading the includes? var product = DbEntities.Products.F

...

基于评论和聊天,这应该工作: int i = 0;

decimal result = 0;

while (i < lstTotalPrices.Items.Count)

{

result += ((frmInventory)lstTotalPrices.Items[i++]).TotalPrice;

}

虽然是一个更整洁的解决方案 int i = 0;

decimal result = 0;

foreach (var item in lstTotalPrices.Items)

...

你放在T前面的out修饰符使它变得协变,但是从MSDN文档中out : 引用类型支持协方差和逆变,但值类型不支持它们。 更新:有时(如果您的设计允许它而您不需要类外的非泛型内容),您可以使用非泛型接口来解决问题: public interface IMyInterface

{ /*non-generic content*/}

public interface IMyInterface : IMyInterface where T : IConvertible

{/*Contents

...

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 OracleP

...

您需要为DataReader指定索引0 : no = Convert.ToInt32(dr[0]);

You need to specify the index 0 for DataReader: no = Convert.ToInt32(dr[0]);

转换为ToDouble时,您错过了TextBox和Label的Text属性。 它应该是这样的: double Quantity = Convert.ToDouble(txtQuantity.Text);

double Price = Convert.ToDouble(lblPrice.Text);

编辑 :为避免输入格式错误,请首先确保输入有效数字,然后使用CultureInfo.InvariantCulture如下所示: double Quantity = Convert.ToDouble(t

...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值