2010-02-26 1 views
8

내 데이터베이스 필드 (SQL Server 2005)는 숫자 (15,2)로 정의됩니다.소수 자릿수가 올바르게 반올림되지 않습니다. LINQ to SQL 버그입니까?

제가

그때 context.SubmitChanges()

위에 스텝이 속성 = 23.6363636363 (등)에 대한 개체의 값을 확인 LINQ 2 SQL 생성 재산권 디버그

[Column(Storage="_My_Property_Name", DbType="Decimal(15,2)", UpdateCheck=UpdateCheck.Never)] 
    public System.Nullable<decimal> My_Property_Name 
    { 
     get 
     { 
      return this._My_Property_Name; 
     } 
     set 
     { 
      if ((this._My_Property_Name != value)) 
      { 
       this.OnMy_Property_NameChanging(value); 
       this.SendPropertyChanging(); 
       this._My_Property_Name = value; 
       this.SendPropertyChanged("My_Property_Name"); 
       this.OnMy_Property_NameChanged(); 
      } 
     } 
    } 

이다

SQL 프로파일 러가 실행 중이며 업데이트 진술입니다.

exec sp_executesql N' 
UPDATE [Staging].[My_Table_Name] 
    SET [LAST_UPDATE_DATE] = @p2, [Field1] = @p3, [Field2] = @p4, [Field3] = @p5, [Field4] = @p6, [Field5] = @p7, [Field6] = @p8, [Field7] = @p9 
WHERE ([Id] = @p0) AND ([RecordVersion] = @p1) 

SELECT [t1].[RecordVersion] FROM [Staging].[My_Table_Name] AS [t1] 
WHERE ((@@ROWCOUNT) > 0) AND ([t1].[Id] = @p10)',N'@p0 int,@p1 timestamp,@p2 datetime,@p3 decimal(21,8),@p4 decimal(21,8),@p5 decimal(21,8),@p6 decimal(21,8), @p7 decimal(21,8),@p8 decimal(21,8),@p9 decimal(15,2),@p10 int',@p0=2935,@p1=0x0000000000323018,@p2='2010-02-26 16:49:21:690', @p3=99.99992307,@p4=99.99992307,@p5=99.99992307,@p6=99.99992307,@p7=99.99992307,@p8=99.99992307, 
@p9=23.63,@p10=2935 

@ p9 = 23.63을 보면 알 수 있듯이 23.64가됩니다.

업데이트

내 질문은,

이 나는이를 찾을 거라고 나는 그것이 알려진 하나가 될 것으로 기대 SQL 버그에 LINQ 인 경우; 어딘가에 유지 된 버그 목록이 있습니까?

또한 은 무엇 주변의 최고의 작품이 될 것인가? 내가 버그를 수정하지 않을 15,3에 필드를 변경 같은데요

  • , 그것은 단지 1 개 소수점 자리를 이동합니다.
  • OnMy_Property_NameChanged()를 재정의하면이 속성이 작동하지만 그 중 많은 수가 있습니다.

업데이트 2

이이 submitchanges 전에이 코드 조각으로 가서 일을 표시하지만, 생성 된 업데이트 SQL은 여전히이 둥글게 업데이트되지 잘린 값을 가지고, 하나가 작동하지 않았다 값.

partial void OnMy_Property_Name_ChangingChanging(decimal? value) 
{ 
    if (!value.HasValue) 
    { 
     return; 
    } 
    value = 
     Math.Round(value.Value, 2, MidpointRounding.AwayFromZero); 
} 

현재 수정 된 사항은 엔티티 값을 직접 업데이트하는 것입니다.

답변

1

MSDN는 말한다 :

진수와 돈 유형 기본 SQL 서버 DECIMAL 유형의 정밀 (왼쪽으로 18 개 진수 숫자와 소수점의 오른쪽)의 정밀도보다 훨씬 작 CLR 소수점 유형으로 이 페어링됩니다. 데이터베이스에 데이터를 저장할 때 정확도가 이 될 수 있습니다. 그러나 SQL Server DECIMAL 형식이 29 자리수보다 큰 정밀도로 구성되어있는 경우에는 그 반대가 될 수 있습니다. SQL 서버 DECIMAL 유형이 인 경우 CLR 시스템보다 더 높은 정밀도 으로 구성되었습니다.데이터베이스에서 데이터를 검색 할 때 십진수, 정밀도 이 (가) 손실 될 수 있습니다.

OnMy_Property_NameChanged()을 무시하고 반올림하여 처리 할 수 ​​있습니다. 올바른 반올림 모드를 지정했는지 확인하십시오 (짝수 또는 제로).

+0

23.63636363636363으로 데이터베이스를 직접 업데이트하면 23.64 ...가됩니다. 괜찮습니다. 속성을 재정의하면이 속성이 수정되지만 15,2 개의 정의 된 필드가있는 큰 DB가됩니다. 모든 개체에 대해 실제로 그렇게하고 싶지는 않습니다. 나는 Linq 2 Sql 버그가 있다면 그것은 이전에 발견되었을 것이라고 생각합니까 ?? (답을 주셔서 감사합니다) –

+0

당신이 그것에 대해 확신을 가지면 리플렉터를 사용하여 linq2sql 내부를 파고들 것을 제안합니다. 분명히 그것은 쿼리 생성기에 관한 것입니다. –

0

LINQ의 버그 인 것 같습니다. DB 유형Decimal(15,2)에서 Decimal(15,3)으로 변경해야합니다. 이것은 데이터베이스의 컬럼 정밀도보다 1 여분의 정밀도를 증가시킵니다. 를 반올림 2 소수점 대신 값을 자르는입니다 SQL 링크 것처럼

+0

그러나 자동 데이터베이스 생성을 사용하는 경우 해당 열은 (15,3)으로 생성됩니다. –

1

그것은 나에게 보인다.