elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección.


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (Moderadores: Novlucker, seba123neo, kub0x, Eleкtro)
| | | |-+  Double C# y Double SQLITE (Separadores con Punto y Coma)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Double C# y Double SQLITE (Separadores con Punto y Coma)  (Leído 200 veces)
MauroMasciar


Desconectado Desconectado

Mensajes: 567



Ver Perfil
Double C# y Double SQLITE (Separadores con Punto y Coma)
« en: 6 Diciembre 2017, 18:13 »

Hola, quería pedir ayuda con este código.
Resulta que tengo una base de datos SQLite, en la cual guardo varios valores de tipo DOUBLE
Cuando yo inserto un dato mediante un cuadro de texto, tengo que poner el valor con coma para que lo guarde correctamente en la tabla, así lo hago.
El tema es cuando quiero recuperar ese dato, lo hago de la siguiente manera:

Código
  1.         public double Obtener_Horas_Aeronave(string ICAO) {
  2.            double Horas = 0;
  3.            conn.Open();
  4.            string query = "select horas from aeronaves where icao = '" + ICAO + "'";
  5.            try {
  6.                SQLiteCommand command = new SQLiteCommand(query, conn);
  7.                SQLiteDataReader dr = command.ExecuteReader();
  8.                dr.Read();
  9.                Horas = dr.GetDouble(0);
  10.                dr.Close();
  11.            } catch (SQLiteException ex) {
  12.                System.Windows.Forms.MessageBox.Show(ex.ToString());
  13.            }
  14.            conn.Close();
  15.            return Horas;
  16.        }
  17.  

Pero salta la excepción:
Código:
Excepción no controlada del tipo 'System.InvalidCastException' en System.Data.SQLite.dll
La conversión especificada no es válida.

Ahora, si entro a la base de datos y cambio por ejemplo "1,09" por "1.09", ahí lo lee y lo devuelve bien, lo devuelve como "1,09"
En la tabla, si esta separado con punto, lo devuelve, si es separado con coma, salta la excepción, pero al guardar solo lo guarda con coma, asi que puedo guardarlo pero no puedo recuperarlo.
¿Que estaré haciendo mal o que me faltará?

Gracias.


En línea

Tutto ha oceani da attraversare mentre hanno il coraggio di farlo Avventato? Ma sanno sogni di limiti

Twitter: @MauroMasciar
Eleкtro
🌍 🕉️ 🛏️ Novato Astral 🛏️ 🕉️ 🌍 y...
Moderador Global
***
Desconectado Desconectado

Mensajes: 9.300


El sentido común es el menos común de los sentidos


Ver Perfil
Re: Double C# y Double SQLITE (Separadores con Punto y Coma)
« Respuesta #1 en: 7 Diciembre 2017, 02:10 »

El problema parece ser evidente, parece ser un problema de lozalización/cultura del separador de decimales, debido a que la función SqliteDataReader.GetDouble() no es capaz de interpretar el separador de decimales coma (,) como un separador válido, y entonces genera una excepción por ese motivo... por que determina que el formato de la expresión no es válido al encontrar una coma en el string, en lugar de un punto.

Practicamente no domino nada el manejo con SQL, así que probablemente habrá una mejor solución (más directa) para esto, como por ejemplo podría ser que buscases el modo de formatear correctamente el separador de decimales al momento de generar la entrada en la tabla, pero me atrevería a decir que este otro tipo de solución podría funcionarte igual:

Código
  1. // ...
  2. string str = dr.GetString(0);
  3. double value;
  4.  
  5. if (str.Contains(",")) {
  6.    double.TryParse(str, NumberStyles.Float, CultureInfo.GetCultureInfo("es-ES"), out value);
  7.  
  8. } else if (str.Contains(".")) {
  9.    double.TryParse(str, NumberStyles.Float, CultureInfo.GetCultureInfo("en-US"), out value);
  10.  
  11. } else {
  12.    double.TryParse(str, NumberStyles.Float, CultureInfo.InvariantCulture, out value);
  13.  
  14. }
  15.  
  16. if (value != 0) {
  17.    Horas = value;
  18.  
  19. } else {
  20.    throw new InvalidCastException();
  21.  
  22. }
  23. // ...

Saludos.


« Última modificación: 7 Diciembre 2017, 02:36 por Eleкtro » En línea


[/cent
MauroMasciar


Desconectado Desconectado

Mensajes: 567



Ver Perfil
Re: Double C# y Double SQLITE (Separadores con Punto y Coma)
« Respuesta #2 en: 7 Diciembre 2017, 13:35 »

Si, ese es el problema justamente. Convertir ese separador.
Este programa ya lo hice en Java y quería una versión en C#, y de repente salen estos fallos raros en cosas tan simples...
Tu solución lamentablemente no sirve, el tipo en la tabla es Double y no puedo obtener un String. Y pasarlo a String y convertirlo cada vez que tenga que usarlo debe ser algo engorroso, ya que ademas de recuperarlo, tengo que hacer operaciones y guardar el nuevo valor. Aparte de que la mayoría de los datos de la tabla es de tipo Double.
Estaba leyendo también que a las consultas en C# con SQLite había que hacerla por parámetros y convertirlos desde allí, ya que lo mismo pasa con Datetime.

Gracias por tomarte el tiempo de contestarme y escribir ese código.
Seguiré investigando a ver que encuentro.
En línea

Tutto ha oceani da attraversare mentre hanno il coraggio di farlo Avventato? Ma sanno sogni di limiti

Twitter: @MauroMasciar
Maurice_Lupin


Desconectado Desconectado

Mensajes: 328

GPS


Ver Perfil WWW
Re: Double C# y Double SQLITE (Separadores con Punto y Coma)
« Respuesta #3 en: 10 Diciembre 2017, 17:20 »

Hola MauroMasciar, si el problema es el separador de decimales, puedes cambiarlo a tus necesidades.

En el FormMainLoad
Código
  1. ' requiere Imports System.Threading
  2. Dim culInfo As CultureInfo
  3. culInfo = New Globalization.CultureInfo("es-ES")
  4. culInfo.NumberFormat.NumberDecimalSeparator = "."
  5. culInfo.NumberFormat.CurrencyDecimalSeparator = "."
  6. culInfo.NumberFormat.PercentDecimalSeparator = "."
  7. culInfo.NumberFormat.CurrencyDecimalSeparator = "."
  8. System.Threading.Thread.CurrentThread.CurrentCulture = culInfo

Saludos.
En línea

Un error se comete al equivocarse.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Double a Char [C++]
Programación C/C++
Talard 2 2,005 Último mensaje 19 Febrero 2012, 19:06
por Akai
Double
Programación General
<<<-Basura->>> 2 612 Último mensaje 11 Octubre 2012, 17:53
por Castiblanco
XSS con Double URL Encode
Nivel Web
MichBukana 0 826 Último mensaje 27 Junio 2014, 14:16
por MichBukana
Double en C
Programación C/C++
xoker 4 958 Último mensaje 20 Julio 2014, 17:00
por CalgaryCorpus
variable puntero a double vs variable double
Programación C/C++
fafafa01 3 864 Último mensaje 26 Junio 2016, 10:14
por fafafa01
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines