none
Error al grabar en base de datos. RRS feed

  • Pregunta

  • Hola, tengo un problea cuando quiero escribir en una base de datos .mdf

    Tengo unos datos cargados en un dataGrid y cuando envio la consulta me da error de que no puede convertir el tipo

    varchar a float. Paso pedazo de codigo.Try
                conexionMDF.ConnectionString = connectionStringMDF
                conexionMDF.Open()

                For Each row As DataGridViewRow In DgvPaciente.Rows
                    Dim PacienteID_OLD As Integer
                    Dim nombre, apellido, sexo, domicilio, telefono, grupo, deporte As String
                    Dim Fnacimiento As String
                    Dim altura, peso As Double

                    PacienteID_OLD = Convert.ToInt32(row.Cells(0).Value)
                    apellido = row.Cells(1).Value
                    nombre = row.Cells(2).Value
                    sexo = row.Cells(3).Value
                    Fnacimiento = row.Cells(4).Value.ToString
                    Fnacimiento = Format(CDate(Fnacimiento), "yyyy-MM-dd")
                    domicilio = row.Cells(5).Value
                    telefono = row.Cells(6).Value
                    altura = Convert.ToDouble(row.Cells(7).Value)
                    peso = Convert.ToDouble(row.Cells(8).Value)
                    grupo = row.Cells(9).Value
                    deporte = row.Cells(10).Value

                    comandoMDF.CommandText = "INSERT INTO Paciente " & _
                      "VALUES('" _
                      & PacienteID_OLD & "','" _
                      & apellido & "','" _
                      & nombre & "','" _
                      & sexo & "','" _
                      & Fnacimiento & "','" _
                      & domicilio & "','" _
                      & telefono & "','" _
                      & altura & "','" _
                      & peso & "','" _
                      & grupo & "','" _
                      & deporte & "')"
                    comandoMDF.Connection = conexionMDF
                    comandoMDF.ExecuteNonQuery()
                Next
                conexionMDF.Close()
            Catch ex As Exception
                conexionMDF.Close()
                MessageBox.Show("No se pudo guardar registro")

            End Try

    ----------------------------

    Asi esta creada la tabla:

    USE [ReporteDB]
    GO
    /****** Object:  Table [dbo].[Paciente]    Script Date: 07/14/2016 10:03:03 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Paciente](
        [PacienteID] [int] IDENTITY(1,1) NOT NULL,
        [PacienteID_OLD] [int] NOT NULL,
        [Apellido] [nvarchar](100) NOT NULL,
        [Nombre] [nvarchar](100) NOT NULL,
        [Sexo] [nvarchar](20) NOT NULL,
        [FNacimiento] [datetime] NOT NULL,
        [Domicilio] [nvarchar](100) NULL,
        [Telefono] [nvarchar](50) NULL,
        [Altura] [float] NULL,
        [Peso] [float] NULL,
        [Grupo] [nvarchar](50) NULL,
        [Deporte] [nvarchar](100) NULL,
     CONSTRAINT [PK_Paciente] PRIMARY KEY CLUSTERED
    (
        [PacienteID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO

    Desde ya muchas gracias y espero que puedan ayudarme. Saludos.

    viernes, 29 de julio de 2016 14:08

Respuestas

  • Tal como has escrito el Insert, está enviando todos los datos como varchar (van entre comillas). Pero en la base de datos tienes campos de otros tipos, por ejemplo, int, datetime o float. Si cualquiera de las cadenas que le pasas no tiene el formato correcto (por ejemplo, el int contiene letras, o la fecha es dia/mes/año en lugar de mes/dia/año, o el float usa coma en lugar de punto, etc. etc., entonces te dará ese error de que "no se puede hacer la conversión".

    En general, es poco recomendable construir una sentencia concatenando texto como lo estás haciendo. Es preferible parametrizar la sentencia y meterle los valores en los parámetros. De esta manera, se puede especificar el tipo correcto en cada parámetro, y si el valor no es correcto puedes detectarlo y corregirlo en lado cliente. Además los parámetros te protegerán contra los ataques de inyección de SQL. No te voy a poner el ejemplo de cómo se parametriza porque sobre este tema se han vertido ríos de tinta, y hay ejemplos a montones por la red.

    • Propuesto como respuesta Willams Morales viernes, 29 de julio de 2016 19:06
    • Marcado como respuesta Adrian_42 sábado, 30 de julio de 2016 19:25
    viernes, 29 de julio de 2016 18:26

Todas las respuestas

  • Tal como has escrito el Insert, está enviando todos los datos como varchar (van entre comillas). Pero en la base de datos tienes campos de otros tipos, por ejemplo, int, datetime o float. Si cualquiera de las cadenas que le pasas no tiene el formato correcto (por ejemplo, el int contiene letras, o la fecha es dia/mes/año en lugar de mes/dia/año, o el float usa coma en lugar de punto, etc. etc., entonces te dará ese error de que "no se puede hacer la conversión".

    En general, es poco recomendable construir una sentencia concatenando texto como lo estás haciendo. Es preferible parametrizar la sentencia y meterle los valores en los parámetros. De esta manera, se puede especificar el tipo correcto en cada parámetro, y si el valor no es correcto puedes detectarlo y corregirlo en lado cliente. Además los parámetros te protegerán contra los ataques de inyección de SQL. No te voy a poner el ejemplo de cómo se parametriza porque sobre este tema se han vertido ríos de tinta, y hay ejemplos a montones por la red.

    • Propuesto como respuesta Willams Morales viernes, 29 de julio de 2016 19:06
    • Marcado como respuesta Adrian_42 sábado, 30 de julio de 2016 19:25
    viernes, 29 de julio de 2016 18:26
  • Hola:
    Si tienes un DataGridView enlazado a un datatable, no es preciso que recorras el DataGridView para grabar su datatable

    Dim loDataTable As DataTable = CType(Me.DataGridView1.DataSource, DataTable)
    gP_DataTableToTable(loDataTable, "MI_TABLA")

        Private Sub gP_DataTableToTable(ByRef rdtDataTable As DataTable, ByVal vsTabla As String)
            For Each row As DataRow In rdtDataTable.Rows
                'Las filas recién agregadas se consideran filas insertadas
                row.SetAdded()
            Next
            Try
                    Using loConexion As New SqlConnection(TU_CADENA_CONEXION)
                        Using loDataAdapter As New SqlDataAdapter("Select * From " & vsTabla, loConexion)
                            Dim cmdBuilder As New SqlCommandBuilder(loDataAdapter))
                            loDataAdapter.Update(rdtDataTable)
                        End Using
                    End Using
           Catch ex As Exception
                MessageBox.Show(ex.Message, "gP_DataTableToTable", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub

    Un saludo desde Bilbo
    Carlos
    sábado, 30 de julio de 2016 10:40
  • Muchas gracias Alberto por tu respuesta, apenas empecé a leer me dí cuenta el error y ademas use parametrización como lo sugeriste. 

    Saludos!

    sábado, 30 de julio de 2016 19:28
  • Gracias por tu respuesta, muy interesante voy a utilizarlo en mi código.

    Saludos!

    sábado, 30 de julio de 2016 19:30