none
Insert into duplica registros vb.net

    Pregunta

  • Saludos, tengo este problema y por mas que he buscado no doy con la solucion, tengo este codigo:

                Dim insertarcorte As New SqlCommand
                With insertarcorte 
                    .Connection = cnn
                    cnn.Open()
                    .CommandText = "Insert into Cortes (Caja, FechainicioOperaciones, idUsuario) " &
                                   " values (@caja, @FechainicioOperaciones, @idUsuario)"
                    .Parameters.Clear()
                    .Parameters.AddWithValue("@caja", 1)
                    .Parameters.AddWithValue("@FechainicioOperaciones", Now)
                    .Parameters.AddWithValue("@idUsuario", idusuarioactivo)
                    .ExecuteNonQuery()
                    cnn.Close()
                End With

                Dim insertarcortesql As New SqlDataAdapter(insertarcorte)
                Dim insertarcortedt As New DataTable
                insertarcortesql.Fill(insertarcortedt)

    El detalle es que me duplica el registro quedan.

    IdCorte Caja    FechaInicioOperaciones        IdUsuario
         2           1 2017-03-24 13:01:21.503    16
         1           1 2017-03-24 13:01:21.503    16

    la columna idCorte es de identidad, al no saber la razon del porque me duplicaba recorri esa parte del codigo por pasos y hasta el 

    .ExecuteNonQuery() todo lo hace bien pero al ejecutar esta linea de codigo insertarcortesql.Fill(insertarcortedt) es cuando me hace el duplicado.

    Cabe señalar que he cambiado el sqldataadapter por un reader y pasa exactamente lo mismo, siempre he programado de esa manera y nunca habia tenido este peculiar problema, espero me pudan ayudar, gracias de antemano

    viernes, 24 de marzo de 2017 20:14

Respuestas

  • Hola darkmoncho,

    Entonces según el código mostrado, no es necesario el DataTable para obtener el resultado del SCOPE_IDENTITY() puedes hacer uso del executeScalar(), además no es necesario agregar un alias al resultado del 'scope..' ya que solo quieres su valor.

    Dim query = "Insert into Cortes (Caja, FechainicioOperaciones, idUsuario) " &
    "values (@caja, @FechainicioOperaciones, @idUsuario) Select scope_identity()"
    
    Dim cmd As New SqlCommand(query, con)
    
    cmd.Parameters.AddWithValue("@caja", 1)
    cmd.Parameters.AddWithValue("@FechainicioOperaciones", Now)
    cmd.Parameters.AddWithValue("@idUsuario", idusuarioactivo)
    
    'Ejecutamos la consulta y obtenemos el resultado del Scope
    Dim id As Integer = CInt(cmd.ExecuteScalar())
    
    'Mensaje informativo
    MessageBox.Show(String.Format("El corte fue registrado y su ID es = {0}", id))

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta darkmoncho viernes, 24 de marzo de 2017 21:07
    viernes, 24 de marzo de 2017 20:59

Todas las respuestas

  • Hola darkmoncho,

    ¿Por qué necesitas un DataTable si lo que estás haciendo es un INSERT y no un SELECT ? Deberías utilizar el using para cerrar la conexión automáticamente y liberar el objeto utilizado.

    Por lo que bastaría con :

    Try
        Using con As New SqlConnection("MiCadenaConexion")
    
            con.Open()
    
            Dim query = "Insert into Cortes (Caja, FechainicioOperaciones, idUsuario) " &
                         "values (@caja, @FechainicioOperaciones, @idUsuario)"
    
            Dim cmd As New SqlCommand(query, con)
    
            cmd.Parameters.AddWithValue("@caja", 1)
            cmd.Parameters.AddWithValue("@FechainicioOperaciones", Now)
            cmd.Parameters.AddWithValue("@idUsuario", idusuarioactivo)
    
            'Ejecutamos la consulta
            cmd.ExecuteNonQuery()
    
            'Mensaje informativo
            MessageBox.Show("El Corte fue registrado!")
    
        End Using
    
    Catch ex As Exception
        'Si se produce algún error lo mostramos
        MessageBox.Show(ex.Message)
    End Try

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    viernes, 24 de marzo de 2017 20:29
  • Intenta con esto

       Public Function insertarcorte(ByVal id As Integer, <aqui van los parametros) As Single
            Dim Conection As New SQL
            Dim Query As String
            Query = " AQUI VA LA CONSULTA SQL"
            Dim cmd As New System.Data.SqlClient.SqlCommand
            cmd.CommandType = System.Data.CommandType.Text
            cmd.CommandText = Query
            cmd.Connection = Conection.Connect
            Conection.Connect.Open()
            cmd.ExecuteNonQuery()
            Conection.Connect.Close()
        End Function

    viernes, 24 de marzo de 2017 20:33
  • ups, si perdon, uso un datatable para recuperar el idcorte de identidad, se me paso aqui agregar esa linea de codigo: este el codigo correcto:

    Dim insertarcorte As New SqlCommand
                With insertarcorte 
                    .Connection = cnn
                    cnn.Open()
                    .CommandText = "Insert into Cortes (Caja, FechainicioOperaciones, idUsuario) " &
                                   " values (@caja, @FechainicioOperaciones, @idUsuario) &

                                   "select scope_identity() as identidad"
                    .Parameters.Clear()
                    .Parameters.AddWithValue("@caja", 1)
                    .Parameters.AddWithValue("@FechainicioOperaciones", Now)
                    .Parameters.AddWithValue("@idUsuario", idusuarioactivo)
                    .ExecuteNonQuery()
                    cnn.Close()
                End With

                Dim insertarcortesql As New SqlDataAdapter(insertarcorte)
                Dim insertarcortedt As New DataTable
                insertarcortesql.Fill(insertarcortedt)

    viernes, 24 de marzo de 2017 20:52
  • Hola darkmoncho,

    Entonces según el código mostrado, no es necesario el DataTable para obtener el resultado del SCOPE_IDENTITY() puedes hacer uso del executeScalar(), además no es necesario agregar un alias al resultado del 'scope..' ya que solo quieres su valor.

    Dim query = "Insert into Cortes (Caja, FechainicioOperaciones, idUsuario) " &
    "values (@caja, @FechainicioOperaciones, @idUsuario) Select scope_identity()"
    
    Dim cmd As New SqlCommand(query, con)
    
    cmd.Parameters.AddWithValue("@caja", 1)
    cmd.Parameters.AddWithValue("@FechainicioOperaciones", Now)
    cmd.Parameters.AddWithValue("@idUsuario", idusuarioactivo)
    
    'Ejecutamos la consulta y obtenemos el resultado del Scope
    Dim id As Integer = CInt(cmd.ExecuteScalar())
    
    'Mensaje informativo
    MessageBox.Show(String.Format("El corte fue registrado y su ID es = {0}", id))

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta darkmoncho viernes, 24 de marzo de 2017 21:07
    viernes, 24 de marzo de 2017 20:59
  • Excelente Joel, lo hice asi como me comentas y funciono a la perfeccion, no conocia la instruccion ExecuteScalar, excelente info para la proxima, saludos y gracias
    viernes, 24 de marzo de 2017 21:07