Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Точность типа Decimal / 2 сообщений из 2, страница 1 из 1
20.08.2003, 16:34
    #32242147
Alexei Petrakov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точность типа Decimal
Есть хранимая процедура на SQL-сервере (MS SQL 2000), возвращающая значение типа decimal(18, 4) (4 знака после запятой) (курс валюты). Вот её текст:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE PROCEDURE [dbo].[GetUSDRate]
  @Date smalldatetime,
  @Rate decimal( 18 ,  4 ) output
AS
begin
  set nocount on

  select @Rate =  0 
  select @Rate = RateUSD from RateUsd
  where Data = @Date
end
GO


И есть функция на C# (VS.NET 2002), которая эту процедуру вызывает:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public decimal wmGetUSDRate(DateTime Date)
{
    SqlCommand Cmd = new SqlCommand();
    Cmd.CommandText =  "GetUSDRate" ;
    Cmd.CommandType = CommandType.StoredProcedure;
    Cmd.Connection = sqlConnection2;
    Cmd.Parameters.Clear();
    Cmd.Parameters.Add( "@Date" , SqlDbType.SmallDateTime);
    Cmd.Parameters.Add( "@Rate" , SqlDbType.Decimal);
    Cmd.Parameters[ "@Rate" ].Direction = ParameterDirection.Output;
    //Cmd.Parameters[ "@Rate" ].Direction = ParameterDirection.InputOutput;//(вместо верхней строки вот эту)
    Cmd.Parameters[ "@Date" ].Value = Date;
    //Cmd.Parameters[ "@Rate" ].Value =  0 . 1111 

    if (this.sqlConnection2.State != ConnectionState.Open)
      this.sqlConnection2.Open();
    Cmd.ExecuteNonQuery();
    this.sqlConnection2.Close();
    return Convert.ToDecimal(Cmd.Parameters[ "@Rate" ].Value);
}


В приведённом виде функция возвращает значение, ОКРУГЛЁННОЕ до целого!!!
Но если вместо строки Cmd.Parameters["@Rate"].Direction = ParameterDirection.Output; написать Cmd.Parameters["@Rate"].Direction = ParameterDirection.InputOutput, а самому параметру @Rate присвоить указанное в комментарии дробное значение, то функция заработает так, как нужно. Мало того, если параметру присвоить десятичное значение не с четырьмя знаками после запятой, а, к примеру, с двумя, то и результат функции окажется округлённым до двух знаков.
Я так понимаю, что надо каким-то образом указать, сколько знаков после запятой необходимо хранить в параметре. Только вот как это сделать я не нашёл. Может кто подскажет...
Спасибо.

ПС: Сама хранимая процедура работает правильно (проверял через Query Analyser).
...
Рейтинг: 0 / 0
26.11.2003, 19:51
    #32336003
EvgeniyW
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точность типа Decimal
Так используйте System.Data.SqlTypes.SqlDecimal
Удачи)))
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Точность типа Decimal / 2 сообщений из 2, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]