2013-04-02 2 views
0

정말 이상한 문제가 있습니다.숫자 (x, x)부터 십진수 (x, x)까지 SQL 서버 이상한

@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 

여기에 관심의 특정 PARAM은 @Size 숫자 (16,6)입니다 : 나는 다음과 같은 PARAMS을 가진 저장된 프로 시저가 있습니다. 나는이 연결 문자열을 얻고있다

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

: 나는 저장된 프로 시저를 호출하고 때 C#을 측면에서 은 내가으로 PARAM을 선언하고 내가 연결을 엽니 다

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

및 수행 보통 command.ExecuteNonQuery(); @Size는 필드가 숫자 (16,6)이므로 75000.000000으로 전달됩니다. 사실, 같은 테이블에 이미 Size 열에 75000.000000과 같은 값을 가진 레코드가 있습니다. 그러나 command.ExecuteNonQuery();으로 전화하면

매개 변수 값 '75000.000000'이 (가) 범위를 벗어납니다.

그래서 매개 변수를 전달하는 대신 저장 프로 시저의 @Size를 75000.000000으로 기본값으로 설정하기로 결정했습니다. 그리고 어떻게 됐을 까? 그것은 작동합니다! 또 다른 흥미로운 점은 SQL 프로파일 러를 사용하여 SP 실행을 캡처하려고하고 있으며 어떤 시도를했는지 또는 캡처 할 이벤트를 선택했는지에 상관없이 SP 실행을 볼 수 없다는 것입니다. EF storeconnection에서 연결 문자열을 가져 오는 중입니까? 아무도 전에 이런 걸 겪었습니까? 이것은 나에게 약간 미쳤다! :)

답변

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