хранимая процедура sqlDecimal to decimal clr Невозможно привести объект типа 'System.Data.SqlTypes.SqlDecimal' к типу 'System.IConvertible' - PullRequest
2 голосов
/ 27 июля 2010

Я новичок в этом.Я пишу хранимую процедуру 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'.

Есть идеи?Спасибо.

Ответы [ 2 ]

6 голосов
/ 27 июля 2010

Проблема в том, что типы Sql не реализуют интерфейс IConvertible, который используется Convert. Вам необходимо привести type к SqlDecimal, а затем использовать свойство Value, чтобы получить представление decimal:

decimal typeForCalculation = ((SqlDecimal)type).Value;
decimal value = aMyValue.Value;
0 голосов
/ 14 октября 2015

Вы должны быть осторожны здесь.

1) SqlDemical может содержать значение Null , поэтому не забудьте проверить свойство SqlDecimal.IsNull .

2) Вызов SqlDecimal.Value может вызвать исключение переполнения, поскольку не каждое значение SqlDecimal может быть преобразовано в десятичное число .NET без потери точности ( SqlDecimal составляет 128 бит, .NET десятичное значение составляет 96 бит). Один из способов избежать исключения переполнения - использовать метод SqlDecimal.Round () .

...