无法将类型为'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
...