none
Me graba los datos en sqlcompack como string

    Pregunta

  • Hola a todos:

    Voy de cabeza con el tema de grabar los datos en una tabla de sqlcompact. Siempre los graba como string aunque le pase una conversión a double o decimal, le da los mismo. No se que tengo que hacer o si hay otra manera de convertir el dato que se graba en double o decimal.

    Y la form que intento grabar el dato, lo estaba grabando desde una lista genérica, pero solo funciona en Access, aquí da error, he optado por probarlo desde un update.

    Public Shared Sub Formula_RatioAutonomia()
            Try
                Dim valor As Integer = AccesoLogica.ObtenerPeriodos()
    
                'Ratios Autonomía
                For i = 0 To valor
                    If DeudasTotales(i) = 0 Then
                        RatioAutonomia(i) = 0
                    Else
                        RatioAutonomia(i) = (PatrimonioNeto(i) / DeudasTotales(i))
                    End If
                Next i
    
                ' Declaramos una variable Connection
                Using cnn As DbConnection = da.CreateConnection()
    
                    ' Creamos el Commando
                    Dim cmd As DbCommand = cnn.CreateCommand
    
                    cmd.CommandText = "UPDATE Ratios Set Ejer_01 = @ejer0, Ejer_02 = @ejer1, Ejer_03 = @ejer2, Ejer_04 = @ejer3, Ejer_05 = @ejer4 " &
                                "WHERE Cod_Empresa = @empresa And Orden = @orden "
    
                    '//Cash Flow Generado
                    With cmd.Parameters
                        .Clear()
                        For i = 0 To valor
                            .Add(Configuracion.CreateParameter(cmd, String.Format("@ejer{0}", i), Convert.ToDouble(RatioAutonomia(i))))
                        Next
    
                        .Add(Configuracion.CreateParameter(cmd, "@empresa", VarGlobal.StrCodEmpresa))
                        .Add(Configuracion.CreateParameter(cmd, "@orden", "096"))
                    End With
    
                    ' Asignamos la conexión al comando
                    cmd.Connection = cnn
                    cnn.Open()
                    cmd.ExecuteNonQuery()
                End Using
    
    
            Catch ex As Exception
                MessageBox.Show("Bloqueo en carga de Fórmula: '3333'" & vbCrLf & ex.Message & vbCrLf &
                   "Acepte para continuar.", "FINANCIAL SYSTEM", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End Sub
    

    Indicando que el valor de la propiedad RatioDeAutonomia(i) es double.

    A ver si veis algo que tenga mal o cualquier otra solución.

    Muchas gracias.

    Gemma

    jueves, 29 de septiembre de 2016 8:18

Respuestas

  • "gemma_campillo" escribió:

    > Voy de cabeza con el tema de grabar los datos en una tabla de sqlcompact.
    > Siempre los graba como string aunque le pase una conversión a double o
    > decimal, le da los mismo.

    Hola, Gemma:

    Si se graba como "string", digo yo que el campo de la tabla estará definido como alfanumérico (nvarchar), porque si estuviera definido con algún tipo de dato numérico (int, numeric, float, real), no podrías, o no deberías, almacenar en el mismo datos alfanuméricos, aunque estos parezcan números de doble precisión.

    Lo primero que te diría es que revisaras el tipo de dato que tiene el campo en la tabla.

    > Y la form que intento grabar el dato, lo estaba grabando desde una lista
    > genérica, pero solo funciona en Access, aquí da error, he optado por
    > probarlo desde un update.

    ¿Y cual es la descripción del error que obtienes?

    > Indicando que el valor de la propiedad RatioDeAutonomia(i) es double.

    Si los datos de los elementos de la matriz RatioDeAutonomia son del tipo Double, entiendo que la siguiente conversión está de más:

        For i = 0 To valor
            .Add(Configuracion.CreateParameter(cmd, String.Format("@ejer{0}", i), Convert.ToDouble(RatioAutonomia(i))))
        Next

    Es como si tienes declarada una variable del tipo Integer y efectuas una conversión para asignarle un valor que también es Integer:

        Dim n As Integer = 5
    
        ' No es necesaria la conversión porque la variable 'n' tambiés es Integer
        Dim variable As Integer = CInt(n)

    Te dejo la relación de tipos de datos de .NET con sus equivalentes en SQL Server Compact:

    Asignaciones de tipos de datos administrados (SQL Server Compact)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    jueves, 29 de septiembre de 2016 9:13
    Moderador
  • "gemma_campillo" escribió:

    > Esto es muy raro, te comento que el tipo de dato es float y no me genera
    > ningún error, solo que cuando veo los datos grabados tanto en la tabla
    > "ratios" por ejemplo o bien en la pantalla, veo el número larguísimo, tal
    > como está grabado en la tabla que al parecer lo graba como "string", cuando
    > en ningún momento hablo de string, solo de double.

    No, los graba como float, porque según la imagen que has publicado, ese es el tipo de dato que tienen los campos llamados Ejer_XX, y normalmente, el valor de estos campos suelen ser bastante largos, porque hablamos de valores de punto flotante de doble precisión de 64 bits (8 bytes).

    Los números que aparecen en el supuesto control DataGridView son números enteros, o al menos, yo no veo ninguna coma decimal en ellos. La pregunta sería: ¿qué tipo de dato almacena las columnas del control DataGridview llamadas Ejer_XX? Si son valores alfanuméricos (String) se guardarán en su respectivos campos como valores float, pero el valor de esos campos float será numérico entero porque no existe una coma decimal.

    El problema está en el tipo de dato que utilizas a la hora de declarar las variables en tu programa, ya que guardas los valores decimales en variable declaradas con el tipo de dato Double, cuando en realidad deberías de haberlas declarado con el tipo de dato Decimal, que es el tipo de dato que se adapta a los cálculos financieros ya que no permite redondeos por exceso o defecto, cosa que sí ocurre con las variables declaradas con el tipo de datos Double, las cuales guardan valores de números reales aproximados:

    Double (Tipo de datos, Visual Basic)

    Decimal (Tipo de datos, Visual Basic)

    Y en cuanto al tipo de dato de los campos en la tabla de la base de datos, en lugar de declararlos como float, que más o menos es como si utilizaras el tipo System.Double de .NET, tendrías que declararlos como Numeric o Decimal, con una precisión de 18 y una escala de 2, por ejemplo, que equivaldría al tipo de dato System.Decimal de .NET, y almacenaría valores decimales como 14,38  20,79  11,08  12,15 en lugar de los números enteros tan elevados que aparecen en el control DataGridView, si estos valores los tomas para efectuar algún porcentaje, claro está.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.




    jueves, 29 de septiembre de 2016 10:58
    Moderador
  • "gemma_campillo" escribió:

    > Si, voy  cambiarlos por Decimal que sirve para las 3 bases de datos,
    > si es así en Access lo arreglaré con el ALter Table y Alter Column ...

    En Access, para definir el tipo como Decimal, tienes que declarar el campo con el tipo Número y las propiedades del campo definir el tamaño como Decimal:


    > Después cualquier conversión que tenga en el programa con Cdbl lo
    > modifico con Cdec y creo si te parece que con eso bastará. Evidentemente
    > lo iré probando pero entiendo que es la forma más rápida de hacerlo.

    Evidentemente prueba todo bien. :-))

    Si por casualidad tienes parámetros añadidos a la colección Parameters de un objeto OleDbCommand o SqlCommand declarados explícitamente con el tipo de dato OleDbType.Double o SqlDbType.Float, tienes que cambiarlo también por el tipo OleDbType.Decimal o SqlDbType.Decimal respectivamente.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    jueves, 29 de septiembre de 2016 11:36
    Moderador
  • Hola Gemma: 

     Solo como aporte adicional, para trabajar con SqlCompact te recomendaría usaras esta herramienta con la cual podrás fácilmente administrar las tablas, ejecutar consultas directamente, exportar la información a archivos SQL, entre otras cosas:

    SQL Compact Query Analyzer

     Esta es otra de las herramientas muy buenas para trabajar con SQLCompact:

    SQL Server Compact & SQLite Toolbox

     Trata de buscar el Stand Alone edition y no necesitaras nada mas. 

    Espero te sea de utilidad.


    Saludos desde Monterrey, Nuevo León, México!!!


    jueves, 29 de septiembre de 2016 15:00

Todas las respuestas

  • "gemma_campillo" escribió:

    > Voy de cabeza con el tema de grabar los datos en una tabla de sqlcompact.
    > Siempre los graba como string aunque le pase una conversión a double o
    > decimal, le da los mismo.

    Hola, Gemma:

    Si se graba como "string", digo yo que el campo de la tabla estará definido como alfanumérico (nvarchar), porque si estuviera definido con algún tipo de dato numérico (int, numeric, float, real), no podrías, o no deberías, almacenar en el mismo datos alfanuméricos, aunque estos parezcan números de doble precisión.

    Lo primero que te diría es que revisaras el tipo de dato que tiene el campo en la tabla.

    > Y la form que intento grabar el dato, lo estaba grabando desde una lista
    > genérica, pero solo funciona en Access, aquí da error, he optado por
    > probarlo desde un update.

    ¿Y cual es la descripción del error que obtienes?

    > Indicando que el valor de la propiedad RatioDeAutonomia(i) es double.

    Si los datos de los elementos de la matriz RatioDeAutonomia son del tipo Double, entiendo que la siguiente conversión está de más:

        For i = 0 To valor
            .Add(Configuracion.CreateParameter(cmd, String.Format("@ejer{0}", i), Convert.ToDouble(RatioAutonomia(i))))
        Next

    Es como si tienes declarada una variable del tipo Integer y efectuas una conversión para asignarle un valor que también es Integer:

        Dim n As Integer = 5
    
        ' No es necesaria la conversión porque la variable 'n' tambiés es Integer
        Dim variable As Integer = CInt(n)

    Te dejo la relación de tipos de datos de .NET con sus equivalentes en SQL Server Compact:

    Asignaciones de tipos de datos administrados (SQL Server Compact)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    jueves, 29 de septiembre de 2016 9:13
    Moderador
  • Hola maestro:

    Esto es muy raro, te comento que el tipo de dato es float y no me genera ningún error, solo que cuando veo los datos grabados tanto en la tabla "ratios" por ejemplo o bien en la pantalla, veo el número larguísimo, tal como está grabado en la tabla que al parecer lo graba como "string", cuando en ningún momento hablo de string, solo de double.

    Es por ese motivo que no lo entiendo.

    Bueno, no se que más mirar o hacer con este rollo porque la he obligado con la conversión que no sirve para nada, al final, es que graba mal en número y lo graba como string y es lo que no se por qué lo hace.

    Te pongo una imagen de la tabla.

    Bueno maestro, si ves alguna cosa ya se que ma la dirás.

    Un fuerte abrazo.

    Gemma

    jueves, 29 de septiembre de 2016 10:03
  • Hola maestro:

    Ya se donde está el error, el mismo es cuando he intentado grabar los datos desde una lista genérica, ahí es donde me lo pone como string, he pasado por la fórmula (que la he puesto nueva como si no estuviera en la lista genérica) y lo pone correctamente. El problema lo tengo en el update que hago desde la lista genéric que por lo que sea lo toma como string. Voy a repasarla totalmente a ver si veo el error.

    Muchas gracias como siempre querido amigo.

    Que lucha..

    Un abrazo muy fuerte.

    Gemma

    jueves, 29 de septiembre de 2016 10:37
  • "gemma_campillo" escribió:

    > Esto es muy raro, te comento que el tipo de dato es float y no me genera
    > ningún error, solo que cuando veo los datos grabados tanto en la tabla
    > "ratios" por ejemplo o bien en la pantalla, veo el número larguísimo, tal
    > como está grabado en la tabla que al parecer lo graba como "string", cuando
    > en ningún momento hablo de string, solo de double.

    No, los graba como float, porque según la imagen que has publicado, ese es el tipo de dato que tienen los campos llamados Ejer_XX, y normalmente, el valor de estos campos suelen ser bastante largos, porque hablamos de valores de punto flotante de doble precisión de 64 bits (8 bytes).

    Los números que aparecen en el supuesto control DataGridView son números enteros, o al menos, yo no veo ninguna coma decimal en ellos. La pregunta sería: ¿qué tipo de dato almacena las columnas del control DataGridview llamadas Ejer_XX? Si son valores alfanuméricos (String) se guardarán en su respectivos campos como valores float, pero el valor de esos campos float será numérico entero porque no existe una coma decimal.

    El problema está en el tipo de dato que utilizas a la hora de declarar las variables en tu programa, ya que guardas los valores decimales en variable declaradas con el tipo de dato Double, cuando en realidad deberías de haberlas declarado con el tipo de dato Decimal, que es el tipo de dato que se adapta a los cálculos financieros ya que no permite redondeos por exceso o defecto, cosa que sí ocurre con las variables declaradas con el tipo de datos Double, las cuales guardan valores de números reales aproximados:

    Double (Tipo de datos, Visual Basic)

    Decimal (Tipo de datos, Visual Basic)

    Y en cuanto al tipo de dato de los campos en la tabla de la base de datos, en lugar de declararlos como float, que más o menos es como si utilizaras el tipo System.Double de .NET, tendrías que declararlos como Numeric o Decimal, con una precisión de 18 y una escala de 2, por ejemplo, que equivaldría al tipo de dato System.Decimal de .NET, y almacenaría valores decimales como 14,38  20,79  11,08  12,15 en lugar de los números enteros tan elevados que aparecen en el control DataGridView, si estos valores los tomas para efectuar algún porcentaje, claro está.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.




    jueves, 29 de septiembre de 2016 10:58
    Moderador
  • "gemma_campillo" escribió:

    > Ya se donde está el error, el mismo es cuando he intentado grabar los
    > datos desde una lista genérica, ahí es donde me lo pone como string, ...

    Pues al campo, variable, propiedad o parámetro de la clase donde tomas los elementos de la lista genérica, cámbiale el tipo de dato String por System.Double, o mejor, System.Decimal.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    jueves, 29 de septiembre de 2016 11:20
    Moderador
  • Hola Enrique:

    Si, voy  cambiarlos por Decimal que sirve para las 3 bases de datos, si es así en Access lo arreglaré con el ALter Table y Alter Column y en sqlcompact y sqlserver expres como aun no la tienen los usuarios, las arreglo a mano. Después cualquier conversión que tenga en el programa con Cdbl lo modifico con Cdec y creo si te parece que con eso bastará. Evidentemente lo iré probando pero entiendo que es la forma más rápida de hacerlo.

    Bueno si te he dicho alguna burrada me metes caña, si no, lo haré así.

    Un duerte abrazo querido.

    Gemma

    jueves, 29 de septiembre de 2016 11:21
  • "gemma_campillo" escribió:

    > Si, voy  cambiarlos por Decimal que sirve para las 3 bases de datos,
    > si es así en Access lo arreglaré con el ALter Table y Alter Column ...

    En Access, para definir el tipo como Decimal, tienes que declarar el campo con el tipo Número y las propiedades del campo definir el tamaño como Decimal:


    > Después cualquier conversión que tenga en el programa con Cdbl lo
    > modifico con Cdec y creo si te parece que con eso bastará. Evidentemente
    > lo iré probando pero entiendo que es la forma más rápida de hacerlo.

    Evidentemente prueba todo bien. :-))

    Si por casualidad tienes parámetros añadidos a la colección Parameters de un objeto OleDbCommand o SqlCommand declarados explícitamente con el tipo de dato OleDbType.Double o SqlDbType.Float, tienes que cambiarlo también por el tipo OleDbType.Decimal o SqlDbType.Decimal respectivamente.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    jueves, 29 de septiembre de 2016 11:36
    Moderador
  • Hola:

    En Access ya lo he probado y lo tengo como me indicas (18,2). Voy a ponerme con ello. Antes hago una copia por si acaso.

    Vale, vamos a ver si todo sale bien.

    Gracias maestro, cuando me respondes se me abre el cielo

    Un abrazo.

    Gemma

    jueves, 29 de septiembre de 2016 11:39
  • Hola Gemma: 

     Solo como aporte adicional, para trabajar con SqlCompact te recomendaría usaras esta herramienta con la cual podrás fácilmente administrar las tablas, ejecutar consultas directamente, exportar la información a archivos SQL, entre otras cosas:

    SQL Compact Query Analyzer

     Esta es otra de las herramientas muy buenas para trabajar con SQLCompact:

    SQL Server Compact & SQLite Toolbox

     Trata de buscar el Stand Alone edition y no necesitaras nada mas. 

    Espero te sea de utilidad.


    Saludos desde Monterrey, Nuevo León, México!!!


    jueves, 29 de septiembre de 2016 15:00
  • Hola José Luis:

    Un placer volver a hablar contigo.

    Tengo la segunda herramienta que me indicas y ahora descargaré la primera.

    El problema lo tengo en un lista que la tengo como double y al grabar me lo graba de esa manera, claro, después cuando lo lee en un datagridview saca la tira de números, todos los que almacena y aún no entiendo por qué.

    Bueno, estoy liada con ello y creo que más o menos ya le tengo cogido el problema.

    Muchas gracias por tu ayuda como siempre.

    Un abrazo.

    Gemma

    jueves, 29 de septiembre de 2016 16:04
  • Hola Gemma el gusto es mio.

     Estoy convencido que el problema lo estas teniendo por los tipos de datos que estas usando al momento de crear la tabla, y tambien coincido con Erique cuando te indica que deberias de crear columnas del tipo Decimal, yo nunca he tenido este tipo de problemas, espero encuentres pronto la solucion.

     Recibe un abrazo desde Mexico.


    Saludos desde Monterrey, Nuevo León, México!!!

    jueves, 29 de septiembre de 2016 17:07