2016-05-04 15 views
5

Ho un'applicazione MVC che dispone di un servizio che aggiorna latitudine e longitudine al database. Invio i valori all'API come stringa e viene convertito in Double prima che venga archiviato nel database come Double. Ecco il codice che sto usando per convertire la stringa in double:Double non è memorizzato correttamente nel database MySQL

Double _latitude, _longitude; 
try 
{ 
    Double.TryParse(lattitude, NumberStyles.Any,CultureInfo.CurrentCulture, out _latitude); 
    Double.TryParse(Longtitude, NumberStyles.Any,CultureInfo.CurrentCulture, out _longitude); 
} 
catch(Exception e) 
{ 
    _latitude = 0; 
    _longitude = 0; 
} 

Quando sono memorizzati nel database mi mancano i punti decimali. Per esempio:

53,345634 viene memorizzata come 53345634

Ho questo lavoro su ambiente di sviluppo in esecuzione su Windows 2012. Ma quando il suo spostato a Windows server di produzione 2008 sto vedendo questo problema.

+0

A seconda della versione di MySQL, è possibile provare a modificare il tipo di dati in virgola mobile o decimale. So che non ha molto senso, ma dalla mia esperienza potrebbe essere una soluzione. –

risposta

3

Specificando corretta IFormatProvider/CultureInfo

Il comportamento che avete osservato potrebbe essere causato dal fatto che due macchine hanno differenti CurrentCulture s. Il valore predefinito di CurrentCulture dipende da una versione di Windows.

Per ottenere risultati coerenti su varie macchine, è necessario fornire uno specifico CultureInfo (o qualsiasi altra classe che implementa IFormatProvider) per il metodo Parse o TryParse, ad es.

// using System.Globalization; 
double value = Double.Parse(stringValue, CultureInfo.InvariantCulture); 

o

metodo
double valueUsEnglish = Double.Parse(stringValue, new CultureInfo("en-US")); 

Parse utilizza un coltura specifico punto decimale simbolo e gruppo separatore simbolo. In alcune lingue (ad es. In inglese) il simbolo del punto decimale è un punto mentre in altri (ad esempio in polacco) è una virgola. I simboli di separatore di gruppo sono anche diversi in varie lingue.

Se 53.345634 viene analizzato come 53345634, il computer utilizza una cultura in cui punto è un separatore di gruppo.

Parse vs TryParse

Si dovrebbe anche pensare se l'utilizzo di ParseTryParse metodo è più appropriato.

Se durante il normale funzionamento il programma prevede un output non valido (ad esempio un valore fornito dall'utente), è necessario utilizzare lo TryParse ed esaminare il valore restituito. TryParse restituisce un valore booleano che indica se l'analisi ha avuto esito positivo e non genera eccezioni.

Se il valore che si sta analizzando non dovrebbe mai essere errato (ad esempio si stanno analizzando le risorse limitate con il proprio programma) è possibile utilizzare Parse. Se si dispone di un modo per recuperare o fornire alcune informazioni aggiuntive all'utente, è possibile rilevare le eccezioni appropriate. Secondo la documentazione, le possibili eccezioni sono: ArgumentNullException, FormatException e OverflowException.

0

Verificare che il tipo di dqta nel DB 2008 è decimale e non int

+0

Nel 2008 DB è il doppio che è lo stesso del DB di sviluppo – Zach

+0

Questo è un commento alla domanda originale, non una risposta. Quando avrai ottenuto il privilegio del commento (in circa un altro rappresentante di sei punti), potrai lasciare commenti. Non è appropriato utilizzare lo spazio Rispondi nel frattempo. –

Problemi correlati