在我的代码中我使用的是System.Data.OracleClient
用于ora数据库连接。我想用以下内容替换这个库(因为它已经过时了)Oracle.DataAccess
。不幸的是我发现 DataRow.Field() 抛出InvalidCastException
。相同的行为是(decimal)x.Rows[0]["COLUME_NAME"]
。我没有这个问题System.Data.OracleClient
.
这是代码示例
using (var oracleConnection = new OracleConnection(connectionString))
{
using (var command = new OracleCommand("select * from tr", oracleConnection))
{
var result = new DataTable();
var adapter = new OracleDataAdapter(command);
adapter.Fill(result);
Console.WriteLine(result.Rows[0].Field<decimal>("TR_SEQ_NUM"));
//Console.WriteLine((decimal)result.Rows[0]["TR_SEQ_NUM"]);
}
}
TR_SEQ_NUM 有NUMBER(8,0)
数据类型和完整异常是:
System.InvalidCastException: Specified cast is not valid.
at System.Data.DataRowExtensions.UnboxT`1.ValueField(Object value)
代码示例使用System.Data.OracleClient
但不与Oracle.DataAccess
我知道我可以使用Convert.ChangeType
但我想知道是否有某种方法可以实现与System.Data.OracleClient
。重构我的所有代码会花费太多时间。
数据库中的值不是小数,并且装箱的 int(错误消息中的“value”参数)无法转换为小数,尽管可以将 int 转换为小数。这个答案会带来更多信息 https://stackoverflow.com/questions/3953391/why-does-intobject10m-throw-specified-cast-is-not-valid-exception.
您可以通过以下方式查看它的实际效果:
void Main()
{
int anInt = 5;
object boxedInt = (object)anInt;
decimal unboxed = Convert.ToDecimal(boxedInt); //5
decimal unboxed2 = (decimal)boxedInt; //InvalidCastException
}
如果您查看 Unbox.ValueField 方法,它确实...
private static T ValueField(object value)
{
if (DBNull.Value == value)
throw DataSetUtil.InvalidCast(Strings.DataSetLinq_NonNullableCast((object) typeof (T).ToString()));
return (T) value;
}
基本上你需要
Convert.ToDecimal(rows[0]["TR_SEQ_NUM"]);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)