Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: MauroMasciar en 6 Diciembre 2017, 18:13 pm



Título: Double C# y Double SQLITE (Separadores con Punto y Coma)
Publicado por: MauroMasciar en 6 Diciembre 2017, 18:13 pm
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.


Título: Re: Double C# y Double SQLITE (Separadores con Punto y Coma)
Publicado por: Eleкtro en 7 Diciembre 2017, 02:10 am
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.


Título: Re: Double C# y Double SQLITE (Separadores con Punto y Coma)
Publicado por: MauroMasciar en 7 Diciembre 2017, 13:35 pm
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.


Título: Re: Double C# y Double SQLITE (Separadores con Punto y Coma)
Publicado por: Maurice_Lupin en 10 Diciembre 2017, 17:20 pm
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.