Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# sqlDecimal到decimal clr存储过程无法强制转换类型为';System.Data.SqlTypes.SqlDecimal';输入';System.IConvertible';_C#_Sql_Stored Procedures_Clr - Fatal编程技术网

C# sqlDecimal到decimal clr存储过程无法强制转换类型为';System.Data.SqlTypes.SqlDecimal';输入';System.IConvertible';

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

我是新来的。我正在编写一个clr存储过程,它调用另一个存储过程来获取计算中使用的值

存储过程返回int(我猜是SqlInt32?表中的值类型是int),然后需要将其转换为十进制

以下是我的代码:

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?我不确定是哪一个);修复了问题-但它似乎不正确。