我是新手。我正在编写一个clr存储过程,它调用另一个存储过程来获取计算中使用的值。
存储过程返回int(我猜SqlInt32?表中的值的类型是int),然后需要将其转换为decimal。
这是我的代码:
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'。
有什么想法吗? 感谢。
答案 0 :(得分:6)
问题是Sql类型没有实现IConvertible
接口,这是Convert
使用的接口。您需要将type
转换为SqlDecimal
,然后使用Value
属性获取decimal
表示形式:
decimal typeForCalculation = ((SqlDecimal)type).Value;
decimal value = aMyValue.Value;
答案 1 :(得分:0)
你需要在这里保持谨慎。
1) SqlDemical 可以包含 Null 值,所以不要忘记检查 SqlDecimal.IsNull 属性。
2)调用 SqlDecimal.Value 属性可能会导致溢出异常,因为并非每个 SqlDecimal 值都可以转换为.NET的十进制而不会丢失精度(< em> SqlDecimal 是128位, .NET的十进制是96位)。避免溢出异常的一个选项是使用 SqlDecimal.Round()方法。