개체의 속성에 올바르게 저장된 값이 있지만 Azure 저장소 데이터베이스에 변경 내용을 저장하면 해당 값을 무시한 double 값이 데이터베이스에 저장됩니다 (7.11000000003은 711로 저장됩니다). 또한 속성은 711.0으로 변경됩니다.Azure 저장 - 저장시 무시되는 소수점
어떻게이 문제를 해결할 수 있습니까?
클래스 및 데이터베이스 테이블에서 필드가 이미 double로 설정되어 있습니다.
개체의 속성에 올바르게 저장된 값이 있지만 Azure 저장소 데이터베이스에 변경 내용을 저장하면 해당 값을 무시한 double 값이 데이터베이스에 저장됩니다 (7.11000000003은 711로 저장됩니다). 또한 속성은 711.0으로 변경됩니다.Azure 저장 - 저장시 무시되는 소수점
어떻게이 문제를 해결할 수 있습니까?
클래스 및 데이터베이스 테이블에서 필드가 이미 double로 설정되어 있습니다.
이 문제는 Dev 저장소가 사용하는 culture 설정으로 인한 것 같습니다. Dev Storage db 내의 TableRow 테이블을 살펴보면 데이터는 XML로 저장되고 십진수 값은 점을 소수점 구분 기호로 사용합니다. 여기 브라질에서는 점이 천 단위 구분 기호입니다. Dev Storage db에서 데이터를 직접 편집하여 점을 쉼표 (PT-BR 소수 구분 기호)로 변경하고 값을 확인했습니다. PT-BR 소수 구분 기호를 사용할 때 값을 읽으면 Dev Storage에서 현재 culture 설정을 사용하고있는 것 같습니다. 그러나 문화를 보존하는 데 데이터가 적용되지 않는 이유는 무엇입니까?
추신 : Windows 로캘을 EN-US로 변경하면 문제가 해결되었습니다. 나는 그것이 내가 그것에 관해 발견 할 수있는 유일한 지위 인 이유다고 생각한다.
자체 필드에 이중 값이 있습니까? 그렇지 않으면 파티션 키 또는 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;
내 두 값이 모두 보존 강하게 루타로 입력된다.
예, 올바른 것 같습니다. SaveChanges() 메서드는 속성의 값을 변경해서는 안되지만, 어쨌든 Double이 저장되도록 허용하지 않는 몇 가지 제약이 있다고 생각하게 만듭니다. 데이빗,이 문제에 대해 어떤 제안이 있니? –
안녕하세요 Fabio - 이중에 대한 제한이 없습니다. 내가 준 예제는 아무런 문제없이 복식을 저장하고 검색 할 수있게 해줍니다.위와 같은 매우 간단한 TableServiceEntity 파생 클래스를 만들려고 했습니까? 또한 저장 장치에 기록한 후 저장소 탐색기 (예 : VS2010에 내장 된 저장소 탐색기)로 데이터를보십시오. 복식이 보이지 않으면 TableServiceEntity에 문제가 있다는 뜻입니다. –
TableServiceEntity 클래스와 동일한 BaseEntity 클래스를 사용하므로 문제가 있어야합니다. 그리고이 회사의 아무도 그것을 파악하지 못하는 것 같습니다. 문제가 BaseEntity 클래스에 있는지 확인한 다음 확인하십시오. 데이빗 감사합니다! –
값을 어떻게 확인하고 있습니까? 로컬 개발 스토리지는 SQL Express를 사용하므로 SQL을 열고 주변을 파고들 수 있습니다. 나는 이것을 피하고 .NET 저장소 클라이언트 라이브러리를 사용하여 값을 다시 읽습니다. 나는 그 값이 올바르게 되돌아 올 것이라고 생각한다.
(아마도 로컬 SQL 백업 저장소에, 값이 과학적 표기법에 저장됩니다?)
로컬 개발 스토리지가 SQL Server Express를 사용하고 있으며 사용자가 의미하는 바를 이해하고 있지만 데이터 자체를 데이터베이스에 저장 한 즉시 값 자체가 변경되기 때문에 이는 매우 이상합니다. 데이터베이스에 저장된 값을 잊어 버립니다. double 속성은 소수점을 잃어버린다. 예를 들어,이 7.11000003은 응용 프로그램에서 711.0이됩니다! 그것은 과학 표기법이 아닙니다. 다른 제안이 있으십니까? 항상 환영합니다! :) –
알 겠어. 왜 그런 일이 일어날 지 모르겠다 ... 당신은 데이비드 코드를 사용해 보셨습니까? 너에게 효과가 있니? – smarx
아니요,하지만 알겠습니다. 회사의 다른 구성원이 동일한 문제를 가지고 아직 해결할 수 없기 때문에 문제가 BaseEntity에 있다고 의심됩니다. smarx 감사합니다! –
나는 노력을 평가하고 아마 내가 충분히 케이스를 노출하지 않았지만,이 중 어느 것도 정말 내 질문에 대답하지 . 이 대답은 단지 현상금을 불공평하게 돌리는 것이 아닙니다. 현상금은> = 2 upvotes의 가장 좋은 답변에 자동으로 귀속되어서는 안됩니다.
검사를 위해 코드를 게시하는 것이 좋습니다. 실제로 코딩 한 것을 보지 않고는 진단 할 수 없습니다. 특히 우리 중 누구도 문제를 재현 할 수 없었기 때문에 진단하기가 어렵습니다. –
고맙습니다 만, 문제가 코드에 없다는 것을 알았습니다. 항상 올바른 것입니다. 로컬 저장소에서는 작동하지 않지만 Azure 원격 저장소에서는 완벽하게 작동합니다. 그 이유는 내가 아직 모르는 것이지만, 그다지 걱정하지 않는 이유입니다. –
이것은 SDK 1.3에서 수정되었습니다 –
우리는 SDK 1.5를 사용하지만 여전히이 문제가 있습니다. 그러나이 게시물은 우리 코드가 정확하다는 것을 보여줍니다. 이것은 Dev Storage의 문제입니다. –