2013-04-02 1 views
0

У меня действительно странная проблема. У меня есть хранимая процедура, которая имеет следующую Params:Числовое (x, x) до десятичного (x, x) Sql Server weirdness

@Id int OUTPUT, 
@DataSourceId int, 
@OwnerId int, 
@Size numeric(16,6), 
@SizeUnitId int, 
@LayCanFrom datetime, 
@LayCanTo datetime, 
@DischargeDate datetime, 
@IMO int, 
@ProductIds inttable readonly, 
@LoadPortIds inttable readonly, 
@DischargePortIds inttable readonly, 
@LoadCountryIds inttable readonly, 
@DischargeCountryIds inttable readonly, 
@LoadZoneIds inttable readonly, 
@DischargeZoneIds inttable readonly, 
@FreightRate numeric(16,6), 
@FreightRateUnitId int, 
@StateId int, 
@OriginalMessage varchar(max), 
@Comments varchar(max) = null 

Конкретные пары интереса здесь является @Size числовым (16,6). На стороне C#, когда я называю хранимую процедуру, я заявляю, Пары как:

var paramSize = command.Parameters.AddParameter("@Size", this.Size); 
paramSize .SqlDbType = SqlDbType.Decimal; 
paramSize .Size = 16; 
paramSize .Precision = 6; 

Я получаю строку соединения, как:

using (var connection = new SqlConnection(
       (context.Connection as EntityConnection).StoreConnection.ConnectionString)) 
     { 
      // Call function to execute the stored proc. 
     } 

Тогда я открыть соединение, и сделать обычный command.ExecuteNonQuery(); Теперь @Size передается как 75000.000000, что должно быть хорошо, так как поле является числовым (16,6). На самом деле, у меня уже есть записи в той же таблице, которые имеют значения, такие как 75000.000000 в столбце «Размер». Однако, когда я звоню command.ExecuteNonQuery();, он возвращается с

Значение параметра '75000.000000' находится за пределами допустимого диапазона.

Таким образом, вместо того, чтобы передавать параметр, я решил установить значение по умолчанию @Size в сохраненной процедуре до 75000.000000. И угадай что? Оно работает! Еще один интересный вопрос заключается в том, что я пытаюсь захватить выполнение SP с использованием SQL Profiler, и независимо от того, что я пытаюсь или какие события я выбираю для захвата, я не могу увидеть выполнение SP. Это потому, что я извлекаю строку подключения из EF storageeconnection? Кто-нибудь сталкивался с чем-то подобным раньше? Это сводит меня с ума! :)

ответ

3

Вы должны установить Scale вместо Size:

paramSize.Precision = 16; 
paramSize.Scale = 6; 

Также отметим, что decimal (или numeric) определяется as:

decimal [ (p[ ,s])] and numeric[ (p[ ,s])] 

Первое число является точность, а второе число - шкала. Итак, @Size numeric(16,6) означает «точность 16, а масштаб 6».

Вы тоже это сбиваете с толку.

+0

Facepalm! Я должен прочитать MSDN немного лучше, прежде чем ставить вопрос. Я чувствую себя идиотом! Большое спасибо! – tranceporter