C# sqlDecimal到decimal clr存储过程无法强制转换类型为';System.Data.SqlTypes.SqlDecimal';输入';System.IConvertible';
我是新来的。我正在编写一个clr存储过程,它调用另一个存储过程来获取计算中使用的值 存储过程返回int(我猜是SqlInt32?表中的值类型是int),然后需要将其转换为十进制 以下是我的代码:C# sqlDecimal到decimal clr存储过程无法强制转换类型为';System.Data.SqlTypes.SqlDecimal';输入';System.IConvertible';,c#,sql,stored-procedures,clr,C#,Sql,Stored Procedures,Clr,我是新来的。我正在编写一个clr存储过程,它调用另一个存储过程来获取计算中使用的值 存储过程返回int(我猜是SqlInt32?表中的值类型是int),然后需要将其转换为十进制 以下是我的代码: public static int CalculateMyValues(SqlDecimal aMyValue, SqlString aMyValueType, out SqlDecimal aResult) { aResult = 0; try { SqlCon
public static int CalculateMyValues(SqlDecimal aMyValue, SqlString aMyValueType, out SqlDecimal aResult)
{
aResult = 0;
try
{
SqlConnection conn = new SqlConnection("context connection=true");
SqlCommand cmd = new SqlCommand("sp_GetType", conn);
cmd.Parameters.AddWithValue("@myValueType", aMyValueType);
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
object type = cmd.ExecuteScalar();
conn.Close();
decimal typeForCalculation = Convert.ToDecimal(type);
decimal value = Convert.ToDecimal(aMyValue); // **
Calculations calc = new Calculations();
decimal result = calc.DoCalculation(typeForCalculation, value);
我得到了一个例外(我认为有见*******):
无法强制转换类型为的对象
“System.Data.SqlTypes.SqlDecimal”到
键入“System.IConvertible”
有什么想法吗?
谢谢。问题在于Sql类型没有实现
IConvertible
接口,而这正是Convert
使用的接口。您需要将类型转换为SqlDecimal
,然后使用Value
属性获得decimal
表示:
decimal typeForCalculation = ((SqlDecimal)type).Value;
decimal value = aMyValue.Value;
你在这里需要小心
1) SqlDemical可以包含Null值,因此不要忘记检查SqlDecimal.IsNull属性
2) 调用SqlDecimal.Value属性可能会导致溢出异常,因为不是每个SqlDecimal值都可以在不丢失精度的情况下转换为.NET的十进制(SqlDecimal为128位,.NET的十进制为96位)。避免溢出异常的一个选项是使用SqlDecimal.Round()方法。谢谢,现在我有另一个异常:System.InvalidCastException:指定的强制转换无效。可能是存储过程返回int(或SqlInt32?我不确定是哪一个);修复了问题-但它似乎不正确。