sqlDecimal到decimal clr存储过程无法将类型为'System.Data.SqlTypes.SqlDecimal'的对象强制转换为'System.IConvertible'

时间:2010-07-27 15:05:31

标签: c# sql stored-procedures clr

我是新手。我正在编写一个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'。

有什么想法吗? 感谢。

2 个答案:

答案 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()方法。