2010-06-14 8 views
1

개체의 속성에 올바르게 저장된 값이 있지만 Azure 저장소 데이터베이스에 변경 내용을 저장하면 해당 값을 무시한 double 값이 데이터베이스에 저장됩니다 (7.11000000003은 711로 저장됩니다). 또한 속성은 711.0으로 변경됩니다.Azure 저장 - 저장시 무시되는 소수점

어떻게이 문제를 해결할 수 있습니까?

클래스 및 데이터베이스 테이블에서 필드가 이미 double로 설정되어 있습니다.

답변

2

이 문제는 Dev 저장소가 사용하는 culture 설정으로 인한 것 같습니다. Dev Storage db 내의 TableRow 테이블을 살펴보면 데이터는 XML로 저장되고 십진수 값은 점을 소수점 구분 기호로 사용합니다. 여기 브라질에서는 점이 천 단위 구분 기호입니다. Dev Storage db에서 데이터를 직접 편집하여 점을 쉼표 (PT-BR 소수 구분 기호)로 변경하고 값을 확인했습니다. PT-BR 소수 구분 기호를 사용할 때 값을 읽으면 Dev Storage에서 현재 culture 설정을 사용하고있는 것 같습니다. 그러나 문화를 보존하는 데 데이터가 적용되지 않는 이유는 무엇입니까?

추신 : Windows 로캘을 EN-US로 변경하면 문제가 해결되었습니다. 나는 그것이 내가 그것에 관해 발견 할 수있는 유일한 지위 인 이유다고 생각한다.

+0

이것은 SDK 1.3에서 수정되었습니다 –

+0

우리는 SDK 1.5를 사용하지만 여전히이 문제가 있습니다. 그러나이 게시물은 우리 코드가 정확하다는 것을 보여줍니다. 이것은 Dev Storage의 문제입니다. –

3

자체 필드에 이중 값이 있습니까? 그렇지 않으면 파티션 키 또는 rowkey 필드에 있습니까? PartitionKey 및 RowKey는 항상 문자열입니다.

방금 ​​두 필드로 행을 쓰고 읽는 간단한 테스트를 만들었습니다. 값은 잘 보존됩니다.

public class SmsMessage: TableServiceEntity 
{ 
    public double MyDouble { get; set; } 
    public SmsMessage(string destination, string message, double myDouble) 
    { 
     PartitionKey = destination; 
     RowKey = message; 
     MyDouble = myDouble; 
    } 
    public SmsMessage() 
     : base("", string.Format("{0:d10}", DateTime.Now.Ticks)) 
    { 
    } 
} 

을 내가 다음에 쓰기 : 나는 msdev.com (나는 설명을 위해 MyDouble하기 위해 INT 지연 필드에 나섭니다 및 부동 소수점으로 변경하고, 개명) 훈련을 통해 빌 Lodin의 SMS 코드에서 샘플 SmsMessage 클래스를 수정 SmsMessageTable :

smsTable.AddObject("SmsMessages", new SmsMessage(destination, message, myDouble)); 
smsTable.SaveChanges(); 

나는 테이블에 저장 탐색기에서이 문제를보고, 내 복식 (예 : 1.2345) 내가 그들을 입력하는 방법입니다.

나는 다음 파티션 키에 지정된 사용자 이름, 간단한 LINQ 쿼리와 검색 :

var results = from m in smsTable.SmsMessages 
         where m.PartitionKey.Equals(txtDestination.Text.Trim()) 
         select m; 

내 두 값이 모두 보존 강하게 루타로 입력된다.

+0

예, 올바른 것 같습니다. SaveChanges() 메서드는 속성의 값을 변경해서는 안되지만, 어쨌든 Double이 저장되도록 허용하지 않는 몇 가지 제약이 있다고 생각하게 만듭니다. 데이빗,이 문제에 대해 어떤 제안이 있니? –

+1

안녕하세요 Fabio - 이중에 대한 제한이 없습니다. 내가 준 예제는 아무런 문제없이 복식을 저장하고 검색 할 수있게 해줍니다.위와 같은 매우 간단한 TableServiceEntity 파생 클래스를 만들려고 했습니까? 또한 저장 장치에 기록한 후 저장소 탐색기 (예 : VS2010에 내장 된 저장소 탐색기)로 데이터를보십시오. 복식이 보이지 않으면 TableServiceEntity에 문제가 있다는 뜻입니다. –

+0

TableServiceEntity 클래스와 동일한 BaseEntity 클래스를 사용하므로 문제가 있어야합니다. 그리고이 회사의 아무도 그것을 파악하지 못하는 것 같습니다. 문제가 BaseEntity 클래스에 있는지 확인한 다음 확인하십시오. 데이빗 감사합니다! –

1

값을 어떻게 확인하고 있습니까? 로컬 개발 스토리지는 SQL Express를 사용하므로 SQL을 열고 주변을 파고들 수 있습니다. 나는 이것을 피하고 .NET 저장소 클라이언트 라이브러리를 사용하여 값을 다시 읽습니다. 나는 그 값이 올바르게 되돌아 올 것이라고 생각한다.

(아마도 로컬 SQL 백업 저장소에, 값이 과학적 표기법에 저장됩니다?)

+0

로컬 개발 스토리지가 SQL Server Express를 사용하고 있으며 사용자가 의미하는 바를 이해하고 있지만 데이터 자체를 데이터베이스에 저장 한 즉시 값 자체가 변경되기 때문에 이는 매우 이상합니다. 데이터베이스에 저장된 값을 잊어 버립니다. double 속성은 소수점을 잃어버린다. 예를 들어,이 7.11000003은 응용 프로그램에서 711.0이됩니다! 그것은 과학 표기법이 아닙니다. 다른 제안이 있으십니까? 항상 환영합니다! :) –

+1

알 겠어. 왜 그런 일이 일어날 지 모르겠다 ... 당신은 데이비드 코드를 사용해 보셨습니까? 너에게 효과가 있니? – smarx

+0

아니요,하지만 알겠습니다. 회사의 다른 구성원이 동일한 문제를 가지고 아직 해결할 수 없기 때문에 문제가 BaseEntity에 있다고 의심됩니다. smarx 감사합니다! –

0

나는 노력을 평가하고 아마 내가 충분히 케이스를 노출하지 않았지만,이 중 어느 것도 정말 내 질문에 대답하지 . 이 대답은 단지 현상금을 불공평하게 돌리는 것이 아닙니다. 현상금은> = 2 upvotes의 가장 좋은 답변에 자동으로 귀속되어서는 안됩니다.

+1

검사를 위해 코드를 게시하는 것이 좋습니다. 실제로 코딩 한 것을 보지 않고는 진단 할 수 없습니다. 특히 우리 중 누구도 문제를 재현 할 수 없었기 때문에 진단하기가 어렵습니다. –

+0

고맙습니다 만, 문제가 코드에 없다는 것을 알았습니다. 항상 올바른 것입니다. 로컬 저장소에서는 작동하지 않지만 Azure 원격 저장소에서는 완벽하게 작동합니다. 그 이유는 내가 아직 모르는 것이지만, 그다지 걱정하지 않는 이유입니다. –

관련 문제