none
Me duplica registros al realizar un INSERT INTO en SQL SERVER 2005 con autentificación integrada RRS feed

  • Pregunta

  • Buenos dias,

    Estoy realizando un programa en visual basic 2005, accediendo a un SQL SERVER 2005 que esta en el dominio con autentificación integrada y me esta pasando algo raro que no alcanzo a entender.

    Utilido la framework 2.0

    Resulta que estamos realizando inserciones de registros desde equipos con windows xp (que estan en dominio) y un windows 98.

    Tabla MaterialesArticulos

    id_MaterialesArticulos (char32)       =>clave principal
    Descripcion               (varchar60)
    Largo                      (numeric(4,0)
    ..........
    ..........
    y algunos campos mas.



    mi codigo de inserción es:

                Dim guid As Guid = System.Guid.NewGuid()
                Dim format As String = "N"
          

                Dim SQL As String
                SQL = "INSERT INTO [dbo].[MaterialesArticulos]"
                SQL = SQL + "([id_materialesarticulos], [Descripcion], [Largo]"
                SQL = SQL + "VALUES('"
                SQL = SQL +   guid.ToString(format)           ' => me da un id de 32 dígitos ejem: a712da5cae7911deb73100c026a01d0e
                SQL = SQL + "",'"
                SQL = SQL + Me.mi_TB_Descripcion.Text.ToString                                                      'obligatoria
                SQL = SQL + "',"
                If (Me.mi_TBnum_Largo.Text.ToString <> String.Empty) Then
                    ' SQL = SQL + Me.mi_TBnum_Largo.Text.Replace(","c, "."c) 'remplazo las , por los .
                    SQL = SQL + String.Format("{0:0}", CInt(Me.mi_TBnum_Largo.Text))
                Else
                    SQL = SQL + "NULL"
                End If

               ........................

     'Y cuando tengo formado el codigo SQL, entonces inserto los datos

            Using conn As New SqlConnection("Data Source=W2K3;Initial Catalog=Base_datos;Integrated Security=True")
                Dim accion_sql As New SqlCommand(SQL, conn)
                ' Abrimos la conexión
                conn.Open()
                ' Al salir del bloque Using se cierra la conexión
                Try
                    'cmd.ExecuteNonQuery()
                    accion_sql.ExecuteNonQuery()
                Catch
                    MsgBox("error al Ejecutar_sql_con_confirmacion: " & SQL)
               
                Finally
                    conn.Close()
                    conn.Dispose()
                End Try
            End Using


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

    Bien, el caso es que los registros se estan insertando correctamente, pero hoy me he llevado una sorpresa. LLevamos insertados 900 registros, pero hay 6 registros que estan duplicados y alguno hasta triplicado. Solo me pasa en estos 6 registros.

    Me pongo ha mirar y compruebo estos 6 registros se han insertado desde un equipo windows 98. Desde este equipo se han insertado 140 registros: 134 los ha insertado bien y 6 los ha duplicado o triplicado.

    Colo si el registo duplicado fuera exactamente el mismo que el otro, se produciria un error de identidad, porque la indentidad no puede tener valores repetidos, Observo que si en el registro inicial (el que debería estar unicamente insertado) el campo:

    id_MaterialesArticulos = a712da5cae7911deb73100c026a01d0e

    En el registro duplicado que se ha insertado en la base datos con todos los campos iguales al anterior el campo identidad:

    id_MaterialesArticulos = a712da5dae7911deb73100c026a01d0e

    Si voy a mirar el tercer registro duplicado

    id_MaterialesArticulos = a712da5eae7911deb73100c026a01d0e


    FIJAROS: EL id insertado igual en todo menos en el dígito en negrita que se a cambiado.

    En la base datos voy a mirar y aparece

    id_MaterialesArticulos                                     Descripción                        Largo            ............

    a712da5cae7911deb73100c026a01d0e                 Perfil Aluminio U                    6000
    a712da5dae7911deb73100c026a01d0e                 Perfil Aluminio U                    6000
    a712da5eae7911deb73100c026a01d0e                 Perfil Aluminio U                    6000


    Osea me duplica el registro entero menos el id en el que deja todo igual menos una letra que me va cambiando (((en otro caso era un numero e iva aumentando de uno en uno)))

    => Al usuario no le da ningun mensaje de error. 

    => todas la veces veces que ha producido el error, ha pasado desde un windows 98.

    ¿Que problema puede ser el que me esta provocando este el error de duplicidad?  ¿quien me da un nuevo id al segundo registro que es igual al primero y cambia un digito?

    La verdad estoy intrigado......

    Un saludo



    Ahora mismo me acaba de volver a ocurrir y solo estaba conectado en el programa el usuario con windows 98. => ¿Sera el problema el windows 98?

    Me estoy guardando la información de hora/minuto/segundo en que se inserta el registro

    1º registro          9:24:15''
    2º registro          9:25:11''

    Osea, hay una diferencia de 56 segundos entre el 1º registro insertado y el duplicado


    david
    viernes, 2 de octubre de 2009 8:34

Respuestas

Todas las respuestas

  • Hola.

    Esto no parece un problema relacionado con SQL Server, sino más bien con el desarrollo de tu aplicación.



    Alberto López Grande.
    viernes, 2 de octubre de 2009 10:39
    Moderador
  • Pues al usuario no le da ninguna excepción durante el proceso.

    ¿Como puede ser?
    david
    viernes, 2 de octubre de 2009 10:59
  • No da excepción porque no se produjo excepción alguna: Las inserciones se realizan y no se violan restriciones de integridad (como podría ser una clave duplicada).

    Coincido con Alberto en que es algún problema en la lógica de programación de la aplicación. Suguiero que la ejecute en modo debug paso a paso para ver lo que sucede y que consulte en los foros de programación.

    Si le parece bien, puedo mover este thread al foro de ADO.NET donde posiblemente le puedan ayudar mejor.
    --- Este mensaje se proporciona tal como es, sin garantías de ninguna clase. ---
    viernes, 2 de octubre de 2009 15:41
    Moderador
  • Entonces como puede ser que el id que lo da una funcion aleatoria, aparezca con todos los dígitos iguales a la insercción anterior, excepto en uno que varia = mi aplicación no sabe hacer eso.

    Porque solo me ha aparecido la duplicidad cuando se a realizado desde un windows 98?

    No es posible que al ser autentificacion integrada, que al validar al usuario del 98 tarde y lo vuelva a intentar modificando el id en un dígito??

    Un saludo
    david
    viernes, 2 de octubre de 2009 19:52
  • Hola.

    No, el problema no guarda relación con la autenticación. Es un problema de la aplicación. En cualquier caso, pon una traza en el servidor para ver qué comandos le están llegando.



    Alberto López Grande.
    sábado, 3 de octubre de 2009 6:15
    Moderador
  • Hola,

    Te agradecería en el alma que me comentaras como realizar esa traza, porque habia pensado hacer algo asi y no se como hacerlo

    Un saludo
    david
    sábado, 3 de octubre de 2009 14:38
  • Con el permiso de Alberto.

    Para hacer una traza de las sentencias que llegan al SQL Server usted debe usar el SQL Profiler. En base a lo que sabemos hasta el momento del problema, todo parece indicar que desde la aplicación se hacen varios INSERTs en vez de uno solo.

    También le recomiendo que ejecute su aplicación en modo debug desde su Visual Studio, es posible que la acción o evento que ejecuta el código de programa que inserta datos se esté ejecutando repetidas veces, ya sea por acción directa del usuario o por una programación equivocada.


    --- Este mensaje se proporciona tal como es, sin garantías de ninguna clase. ---
    sábado, 3 de octubre de 2009 15:13
    Moderador
  • Gracias por la respuesta.

    Ya he ejecutado la aplicación de modo debug y el funcionamiento es el correcto.

    Ademas, en los ultimos 2 dias se han insertado 1000 registros, desde xp y un 98,  solo se han producido 7 registros duplicados; y todos ellos desde el windows 98.

    Voy a probar con el SQL Profiler a ver si me dice algo.

    Un saludo


    david
    domingo, 4 de octubre de 2009 5:38
  • ¿donde aparece el sql Profiler?

    Tengo un sql server corriendo bajo small 2003  y no encuentro el programa.

    Tengo que bajarlo de algún sitio??

    Un saludo
    david
    lunes, 5 de octubre de 2009 6:02
  • Hola.

    Es una herramienta cliente, está en el menú de programas en el que está el Management Studio, pero en el submenú Performance Tools.



    Alberto López Grande.
    lunes, 5 de octubre de 2009 8:26
    Moderador
  • Gracias, 

    Ya vi el problema, el SQL del small business server 2003 no lo trae por defecto.

    Como tengo el msdn e instalado la versión standard del sql server 2005 en un xp y ahí, si me ha aparecido la opción.

    Ya tengo monitorizando el SQL. Cuando adivine el problema ( si lo encuentro) lo comento en el post.

    Muy agradecido.....
    david
    lunes, 5 de octubre de 2009 19:29
  • el problema es originado por un "doble" llamado al usar executenonquery. Comenta uno de los 2 que tienes ahí y cambia el código para que ejecute toda la consulta en un solo llamado; a veces cuando se utiliza los selectcomand,   .net ejecuta como si fuese una consulta y al ejecutar executenonquery realiza una doble consulta y se produce la duplicación. No es un problema de SQL Server, es un problema en la aplicación.

    Saludos




    • Editado xavi49 martes, 27 de mayo de 2014 3:11
    • Propuesto como respuesta JuanUC domingo, 4 de octubre de 2020 19:36
    martes, 27 de mayo de 2014 3:04