none
La conversión especificada no es válida al Importar desde Excel

    Pregunta

  • Hola a todos:

    Tengo un problema de conversión de datos y he probado con varios tipo de conversión pero siempre me salta el error. "La conversión especificada no es válida." Estoy intentando importar desde una hoja de excel y salta el error en el parámetro @ej01.

    Lo campos de la tabla a donde se importa son de tipo decimal(18,5) (Antes con el double no me daba problemas).

    Os pongo el código por si podéis ayudarme.

    Private Sub Importar(ByVal rut As String, ByVal ruc As String)
            Cursor = Cursors.WaitCursor
    
            lblImportando.Visible = True
            lblEspere.Visible = True
            VarGlobal.bolActivadoCuadroContable = True
            Dim frmPreparandoInforme = New frmPreparandoInforme
            frmPreparandoInforme.Show()
    
            ' Creamos el acceso a datos mediante el nombre de la cadena de conexión existente en el archivo de configuración de la aplicación.
            Dim da As DataAccessInvariant = DataAccessInvariant.GetDataAccessInvariant(Configuracion.CadenaConexion)
    
            Dim noi As New System.Text.StringBuilder
    
            Try
                ' Declaramos una variable Connection
                Using cnn As DbConnection = da.CreateConnection()
    
                    ' Creamos el Commando
                    Dim cmd As DbCommand = cnn.CreateCommand()
    
                    cnn.Open()
    
                    'Conexión Excel
                    Using cnx As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & rut & ";Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1'")
    
                        cnx.Open()
    
                        ' Dim nombreHoja As String = NombrePrimeraHoja(cnx).Replace("$", "")
    
                        ' Cerrar la conexión para pooder formatear la primera columna
                        cnx.Close()
    
                        ' Dar formato a las celdas. Clase ObjectExcel de Enrique Martínez
                        Using app As New ObjectExcel(rut)
                            app.SetFormatText("A:A")
                        End Using
    
                        cnx.Open()
    
                        Dim hoj As String = NombrePrimeraHoja(cnx)
    
                        Using cmdx As New OleDb.OleDbCommand("SELECT * FROM [" & hoj & "]", cnx)
                            Using dr As OleDb.OleDbDataReader = cmdx.ExecuteReader(CommandBehavior.SingleResult)
                                If dr.HasRows Then
                                    Dim fil As Integer = 1I
                                    Dim tot As Integer = 0I
                                    Dim ccc As String = String.Empty
    
                                    Cursor = Cursors.WaitCursor
    
    
                                    'Dim frmPreparandoInforme = New frmPreparandoInforme
                                    'frmPreparandoInforme.Show()
    
                                    Application.DoEvents()
    
                                    While dr.Read
                                        fil += 1I
                                        If dr.IsDBNull(0I) Then
                                            noi.AppendFormat("NULL (fila {0:N0}){1}", fil, Environment.NewLine)
                                        ElseIf dr.FieldCount.Equals(13I) Then '------ Estamos importando 12 ejercicios
                                            If dr.GetFieldType(0I).Equals(GetType(System.Decimal)) Then
                                                ccc = dr.GetDecimal(0I).ToString("R")
                                            ElseIf dr.GetFieldType(0I).Equals(GetType(System.String)) Then
                                                ccc = dr.GetString(0I)
                                            End If
    
                                            cmd.CommandText = ("UPDATE Balances SET Ejer_01 = @ej1, Ejer_02 = @ej2, Ejer_03 = @ej3, Ejer_04 = @ej4, Ejer_05 = @ej5, Ejer_06 = @ej6, Ejer_07 = @ej7, Ejer_08 = @ej8, Ejer_09 = @ej9, Ejer_10 = @e10, Ejer_11 = @e11, Ejer_12 = @e12 WHERE IdEmpresa = '" & VarGlobal.StrCodEmpresa & "' AND Cód_GC = '" & ccc & "'")
                                            With cmd.Parameters
                                                .Clear()
                                                .Add(Configuracion.CreateParameter(cmd, "@ej1", dr.GetDecimal(1I)))   '////// Aquí ya salta el error de conversión.//////
                                                .Add(Configuracion.CreateParameter(cmd, "@ej2", dr.GetDecimal(2I)))
                                                .Add(Configuracion.CreateParameter(cmd, "@ej3", dr.GetDecimal(3I)))
                                                .Add(Configuracion.CreateParameter(cmd, "@ej4", dr.GetDecimal(4I)))
                                                .Add(Configuracion.CreateParameter(cmd, "@ej5", dr.GetDecimal(5I)))
                                                .Add(Configuracion.CreateParameter(cmd, "@ej6", dr.GetDecimal(6I)))
                                                .Add(Configuracion.CreateParameter(cmd, "@ej7", dr.GetDecimal(7I)))
                                                .Add(Configuracion.CreateParameter(cmd, "@ej8", dr.GetDecimal(8I)))
                                                .Add(Configuracion.CreateParameter(cmd, "@ej9", dr.GetDecimal(9I)))
                                                .Add(Configuracion.CreateParameter(cmd, "@e10", dr.GetDecimal(10I)))
                                                .Add(Configuracion.CreateParameter(cmd, "@e11", dr.GetDecimal(11I)))
                                                .Add(Configuracion.CreateParameter(cmd, "@e12", dr.GetDecimal(12I)))
                                            End With
                                            If cmd.ExecuteNonQuery.Equals(0I) Then noi.AppendFormat("{0} (fila {1:N0}){2}", ccc, fil, Environment.NewLine)
                                            tot += 1I
                                        cmd.Parameters.Clear()
                                    End While
    
                                    'frmPreparandoInforme.Close()
    
                                    CargaDatagridView1()
    
                                    'Dim Cód_GC As String
    
                                    If noi.Length.Equals(0I) Then
                                        System.Windows.Forms.MessageBox.Show("Importación finalizada" & Environment.NewLine & "Se han importado " & tot.ToString("N0") & " filas del archivo «" & ruc & "»", Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
                                    Else
                                        'Dim msg As String = String.Format("Importación finalizada.{0}Se han importado {1} filas del archivo «{2}» con el código contable {3}", Environment.NewLine, tot.ToString("N0"), ruc, & 'Cód_GC')
                                        'MessageBox.Show(msg, Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
                                        System.Windows.Forms.MessageBox.Show("Importación finalizada" & Environment.NewLine & "Se han importado " & tot.ToString("N0") & " filas del archivo «" & ruc & "». Las siguientes cuentas no han sido importadas:" & Environment.NewLine & Environment.NewLine & noi.ToString, Text, MessageBoxButtons.OK, MessageBoxIcon.Information)
                                    End If
                                Else
                                    System.Windows.Forms.MessageBox.Show("La hoja de cálculo «" & hoj & "» no contiene datos para importar", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                                End If
                                dr.Close()
    
                                Cursor = Cursors.Default
    
                            End Using
                        End Using
    
                    End Using
                End Using
    
                bolCambiosDatagridView = True 'Para activar la carga de fórmulas.
                CuadreBalances()
    
            Catch ex As Exception
                Dim msg As String = String.Empty
                If (ex.InnerException Is Nothing) Then
                    msg = ex.Message
                Else
                    msg = ex.InnerException.Message
                End If
    
                MessageBox.Show(msg)
            Finally
                Cursor = Cursors.Default
                lblImportando.Visible = False
                lblEspere.Visible = False
                frmPreparandoInforme.Close()
            End Try
    
        End Sub

    Un cordial saludo.

    Gemma

    lunes, 24 de octubre de 2016 20:02

Respuestas

  • Fíjate en que el error de conversión te lo da en el dr.GetDecimal. Es decir, te da un error al intentar leer un Decimal desde Excel, y no al intentar grabar el Decimal sobre la tabla de destino (que es la que has comentado que tiene un campo de tipo Decimal). Yo me centraría más bien en fijarme en qué es lo que hay en esa celda del Excel, a ver por qué no se puede convertir en Decimal. Por ejemplo, puede ser que la celda esté en blanco, o que sea de tipo carácter en lugar de numérico.
    • Marcado como respuesta gemma_campillo martes, 25 de octubre de 2016 6:26
    lunes, 24 de octubre de 2016 20:23

Todas las respuestas

  • Fíjate en que el error de conversión te lo da en el dr.GetDecimal. Es decir, te da un error al intentar leer un Decimal desde Excel, y no al intentar grabar el Decimal sobre la tabla de destino (que es la que has comentado que tiene un campo de tipo Decimal). Yo me centraría más bien en fijarme en qué es lo que hay en esa celda del Excel, a ver por qué no se puede convertir en Decimal. Por ejemplo, puede ser que la celda esté en blanco, o que sea de tipo carácter en lugar de numérico.
    • Marcado como respuesta gemma_campillo martes, 25 de octubre de 2016 6:26
    lunes, 24 de octubre de 2016 20:23
  • Hola querido Alberto:

    Efectivamente el error estaba en la lectura del campo de la hoja de Excel.

    Ahora funciona perfectamente la importación en las 3 bases de datos: Access, COmpact y SqlExpress.

    Me estaba asustando con este tema ya que no lo entendía, ahora hace la importación de 5 ejercicios en 4 segundos, una pasada.

    Bueno querido amigo, muchas gracias como siempre por tu ayuda y exactitud en la respuesta.

    Un fuerte abrazo.

    Gemma

    martes, 25 de octubre de 2016 6:26