хранимая процедура clr с SqlContext.Pipe.Send должна возвращать десятичную, возвращает int - PullRequest
0 голосов
/ 19 августа 2011

У меня есть хранимая процедура clr, которая должна возвращать десятичное значение.Я не могу использовать выходные параметры в данный момент - мне нужно повторно использовать существующую библиотеку, которая не обрабатывает выходные параметры.Моя хранимая процедура возвращает значение - но оно потеряло десятичные цифры.
Есть идеи, почему?Спасибо, Дженни

[SqlProcedure]
public static int CalculateMyValue(SqlDecimal aInput1, SqlString aInput2, SqlDecimal aInput3)
{
    try
    {
        //convert second value to code.  call regular stored procedure
        SqlConnection conn = new SqlConnection("context connection=true");
        SqlCommand cmd = new SqlCommand("sp_getCodeForVal", conn);
        cmd.Parameters.AddWithValue("@MyParam", aInput2);
        cmd.CommandType = CommandType.StoredProcedure;
        conn.Open();
        object input2CodeSql = cmd.ExecuteScalar();
        conn.Close();

        if (input2CodeSql == null)
        {
            // debug print
            SqlContext.Pipe.Send(string.Format("aInput2 = {0}", aInput2));
            return 2;
        }

        decimal input2Code = Convert.ToDecimal(input2CodeSql.ToString());
        decimal input1Val = aInput1.Value;
        decimal input3Val = aInput3.Value;

        GetMyDecimal myVal = new GetMyDecimal();
        decimal decValue = myVal.Calculate(input1Val, input2Code, input3Val);
        //debug
        SqlContext.Pipe.Send(string.Format("decValue = {0}", decValue));

        // Create a record object that represents an individual row, including it's metadata.
        SqlDataRecord record = new SqlDataRecord(new SqlMetaData("decValue", SqlDbType.Decimal));

        // Populate the record.
        record.SetDecimal(0, decValue);

        // Send the record to the client.
        SqlContext.Pipe.Send(record);

        return 0;
    }
    catch (Exception)
    {
        return 2;
    }
}

РЕДАКТИРОВАТЬ: забыл добавить что SqlContext.Pipe.Send (string.Format ("decValue = {0}", decValue));показывает десятичные знаки, но SqlContext.Pipe.Send (record);не возвращает десятичных разрядов.

1 Ответ

2 голосов
/ 23 сентября 2011

Точность / масштаб по умолчанию десятичной дроби составляет 18/0. Попробуйте использовать другую перегрузку для создания метаданных:

SqlDataRecord record = new SqlDataRecord(new SqlMetaData("decValue", SqlDbType.Decimal, 19, 9, false, false, SortOrder.Ascending, 0));
...