проблема точности на десятичном DbParameter - PullRequest
4 голосов
/ 05 февраля 2009

в с #, Я использую десятичный DbParameter для хранимой процедуры сервера Sql. Я создаю такой параметр


DbParameter prm = comm.CreateParameter();

prm.ParameterName = "@Price";

prm.DbType = DbType.Decimal;

prm.Direction = ParameterDirection.Output;

comm.Parameters.Add(prm);

//and set the value of comm.Parameters["@Price"] to a variable,

decimal.TryParse(comm.Parameters["@Price"].Value.ToString(), 
  out this.ProdPrice);

Но значение параметра out всегда округляется.

Если я вызываю ту же хранимую процедуру из Sql Server Management Studio, я могу получить это параметр правильно с его точностью

На DbParameter отсутствуют свойства точности или масштаба. И мне нужно использовать DbParameter в пространстве имен System.Data.Common для извлечения данных

Как я могу получить десятичное значение с полной точностью

Заранее спасибо ...

Ответы [ 3 ]

4 голосов
/ 05 февраля 2009

Добавив к предложению Марка, вы можете изменить код на

IDbDataParameter prm = comm.CreateParameter();

Остальная часть кода должна работать нормально. Свойства точности и масштаба являются «явной реализацией интерфейса» в DbParameter.

2 голосов
/ 05 февраля 2009

Вы пробовали установить Точность и Шкала ? Обратите внимание, что вы должны сначала разыграть.

1 голос
/ 05 февраля 2009

Во-первых, вам не нужно анализировать строку, чтобы получить десятичную дробь, вы должны иметь возможность привести ее непосредственно к ней:

this.ProdPrice = (Decimal) comm.Parameters["@Price"].Value;

При этом, какова точность параметра @Price? Я считаю, что SQL Server обеспечивает точность до 35 разрядов, в то время как класс Decimal обеспечивает точность только до 28 разрядов, поэтому, если ваш параметр имеет более 28 разрядов, вы не сможете предотвратить округление.

...