none
Obtener ID autogenerada con Ado.Net RRS feed

  • Pregunta

  • Hola buenos días, quería repreguntar la siguiente duda que tengo.

    Necesito hacer un INSERT con Ado.Net en C# en Windows Forms. Al hacer el insert, posteriormente necesito obtener el valor generado en uno de los campos (Id AutoGenerado).

    La manera de realizar el INSERT es la siguiente.

     public void CargarFecha()
            {
                con = new SqlConnection(@Properties.Settings.Default.ConnectionString);
                con.Open();
    
                SqlCommand cmd = new SqlCommand("INSERT INTO Torneos  (Dia,Torneo,Modalidad,Serie,Buyin,Rebuy,PuntosPorRebuy,Addon,PuntosPorAddon,Stack,Cupo,Ciegas,Premio,CasinoId,GaleriaImagenesId,CategoriaId,SpTorneoId,Nivel,RegistroWeb,RegistroAnticipadoDias,Streaming,Ranking,BonusRanking,Pozo,Comision,Link,Descripcion) VALUES (@Dia,@Torneo,@Modalidad,@Serie,@Buyin,@Rebuy,@PuntosPorRebuy,@Addon,@PuntosPorAddon,@Stack,@Cupo,@Ciegas,@Premio,@CasinoId,@GaleriaImagenesId,@CategoriaId,@SpTorneoId,@Nivel,@RegistroWeb,@RegistroAnticipadoDias,@Streaming,@Ranking,@BonusRanking,@Pozo,@Comision,@Link,@Descripcion)", con);
    
                cmd.Parameters.AddWithValue("@Dia", dtpFechaDelTorneo.Value);
                cmd.Parameters.AddWithValue("@Torneo", "CAP");
                cmd.Parameters.AddWithValue("@Modalidad", "Freezeout");
                cmd.Parameters.AddWithValue("@Serie", "CAP");
                cmd.Parameters.AddWithValue("@Buyin", 6000.00);
                cmd.Parameters.AddWithValue("@Rebuy", 0);
                cmd.Parameters.AddWithValue("@PuntosPorRebuy", 0);
                cmd.Parameters.AddWithValue("@Addon", 0);
                cmd.Parameters.AddWithValue("@PuntosPorAddon", 0);
                cmd.Parameters.AddWithValue("@Stack", 0);
                cmd.Parameters.AddWithValue("@Cupo", 0);
                cmd.Parameters.AddWithValue("@Ciegas", 0);
                cmd.Parameters.AddWithValue("@Premio", 0);
                cmd.Parameters.AddWithValue("@CasinoId", 0);
                cmd.Parameters.AddWithValue("@GaleriaImagenesId", 0);
                cmd.Parameters.AddWithValue("@CategoriaId", 1);
                cmd.Parameters.AddWithValue("@SpTorneoId", 0);
                cmd.Parameters.AddWithValue("@Nivel", 0);
                cmd.Parameters.AddWithValue("@RegistroWeb", 0);
                cmd.Parameters.AddWithValue("@RegistroAnticipadoDias", 0);
                cmd.Parameters.AddWithValue("@Streaming", 0);
                cmd.Parameters.AddWithValue("@Ranking", 0);
                cmd.Parameters.AddWithValue("@BonusRanking", 0);
                cmd.Parameters.AddWithValue("@Pozo", 0);
                cmd.Parameters.AddWithValue("@Comision", 0);
                cmd.Parameters.AddWithValue("@Link", 0);
                cmd.Parameters.AddWithValue("@Descripcion", 0);
    
                cmd.ExecuteNonQuery();
                MessageBox.Show("Se ha cargado la fecha del torneo");
                txtFileName.Enabled = true;
                btnCargarArchivo.Enabled = true;
                txtCargaJugadores.Enabled = true;
            }

    Sé que existe la función Sql scope_identity() pero no sé bien como puedo implementarla en ado. Agradezco toda forma de ayuda!!

    Buenos días!

    • Cambiado Karen Malagón jueves, 2 de julio de 2015 22:08 ADO.NET issue
    miércoles, 1 de julio de 2015 14:11

Respuestas

  • hola

    porque usaste el @@IDENTITY, usa el SCOPE_IDENTITY

    en el articulo estan ambas tecnicas, pero no debias en tu caso usar el @@IDENTITY,

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta mar21_aet lunes, 13 de julio de 2015 15:27
    miércoles, 1 de julio de 2015 16:02

Todas las respuestas

  • hola

    aqui

    [ADO.NET] – Parte 6 - Campos Auto numéricos

    explico como puedes recueprar el id

    como veras despues del insert defines un SELECT del scope_idnetity pero usas el ExecuteScalar() para tomar el valor generado

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 1 de julio de 2015 14:19
  • Hola mar21_aet,

    No uses @@Identity para obtener el ID generado, es una pésima practica. Debes de usar SCOPE_IDENTITY()

    miércoles, 1 de julio de 2015 15:19
  • Me puedes dar un ejemplo? sería igual pero con scope_identity()?
    miércoles, 1 de julio de 2015 15:25
  • Hola mar21_aet,

    Ya recordé tu caso, veo que hiciste caso omiso a todo lo que te sugerí y ya tienes varios días con esto y no logras resolverlo. ¿Intentarás seguir mis recomendaciones?


    miércoles, 1 de julio de 2015 15:35
  • hola

    porque usaste el @@IDENTITY, usa el SCOPE_IDENTITY

    en el articulo estan ambas tecnicas, pero no debias en tu caso usar el @@IDENTITY,

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta mar21_aet lunes, 13 de julio de 2015 15:27
    miércoles, 1 de julio de 2015 16:02
  • >>Me puedes dar un ejemplo? sería igual pero con scope_identity()?

    pero no revisaste el articulo alli mismo explico como se realiza


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 1 de julio de 2015 16:03
  • Es que tu no les mis repuestas a tus sugerencias. Te comenté que no puedo usar stored procedure. Por eso no puedo seguir lo que me propones. Agradezco tu atenta sugerencia y que ayudes a resolver mi problema, pero no es el camino que puedo seguir.
    miércoles, 1 de julio de 2015 17:12
  • Si lo deje así pero no me funciona, en realidad me está devolviendo como valor un 1.

     public int CargarFecha()
            {
                con = new SqlConnection(@Properties.Settings.Default.ConnectionString);
                con.Open();
    
                SqlCommand cmd = new SqlCommand("INSERT INTO Torneos  (Dia,Torneo,Modalidad,Serie,Buyin,Rebuy,PuntosPorRebuy,Addon,PuntosPorAddon,Stack,Cupo,Ciegas,Premio,CasinoId,GaleriaImagenesId,CategoriaId,SpTorneoId,Nivel,RegistroWeb,RegistroAnticipadoDias,Streaming,Ranking,BonusRanking,Pozo,Comision,Link,Descripcion) VALUES (@Dia,@Torneo,@Modalidad,@Serie,@Buyin,@Rebuy,@PuntosPorRebuy,@Addon,@PuntosPorAddon,@Stack,@Cupo,@Ciegas,@Premio,@CasinoId,@GaleriaImagenesId,@CategoriaId,@SpTorneoId,@Nivel,@RegistroWeb,@RegistroAnticipadoDias,@Streaming,@Ranking,@BonusRanking,@Pozo,@Comision,@Link,@Descripcion) SELECT SCOPE_IDENTITY()", con);
    
                cmd.Parameters.AddWithValue("@Dia", dtpFechaDelTorneo.Value);
                cmd.Parameters.AddWithValue("@Torneo", "CAP");
                cmd.Parameters.AddWithValue("@Modalidad", "Freezeout");
                cmd.Parameters.AddWithValue("@Serie", "CAP");
                cmd.Parameters.AddWithValue("@Buyin", 6000.00);
                cmd.Parameters.AddWithValue("@Rebuy", 0);
                cmd.Parameters.AddWithValue("@PuntosPorRebuy", 0);
                cmd.Parameters.AddWithValue("@Addon", 0);
                cmd.Parameters.AddWithValue("@PuntosPorAddon", 0);
                cmd.Parameters.AddWithValue("@Stack", 0);
                cmd.Parameters.AddWithValue("@Cupo", 0);
                cmd.Parameters.AddWithValue("@Ciegas", 0);
                cmd.Parameters.AddWithValue("@Premio", 0);
                cmd.Parameters.AddWithValue("@CasinoId", 0);
                cmd.Parameters.AddWithValue("@GaleriaImagenesId", 0);
                cmd.Parameters.AddWithValue("@CategoriaId", 1);
                cmd.Parameters.AddWithValue("@SpTorneoId", 0);
                cmd.Parameters.AddWithValue("@Nivel", 0);
                cmd.Parameters.AddWithValue("@RegistroWeb", 0);
                cmd.Parameters.AddWithValue("@RegistroAnticipadoDias", 0);
                cmd.Parameters.AddWithValue("@Streaming", 0);
                cmd.Parameters.AddWithValue("@Ranking", 0);
                cmd.Parameters.AddWithValue("@BonusRanking", 0);
                cmd.Parameters.AddWithValue("@Pozo", 0);
                cmd.Parameters.AddWithValue("@Comision", 0);
                cmd.Parameters.AddWithValue("@Link", 0);
                cmd.Parameters.AddWithValue("@Descripcion", 0);
    
                return Convert.ToInt32(cmd.ExecuteNonQuery());
    
                MessageBox.Show("Se ha cargado la fecha del torneo");
                txtFileName.Enabled = true;
                btnCargarArchivo.Enabled = true;
                txtCargaJugadores.Enabled = true;
            }
    Está bien hecho así?

    miércoles, 1 de julio de 2015 17:26
  • >>Te comenté que no puedo usar stored procedure

    que procedure ? tenias que ver el ejemplo del titulo "1- Obtener Identity en la misma consulta "

    analiza el codigo del metodo Inert()

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 1 de julio de 2015 17:30
  • Leandro le estoy repondiendo al compañero Willams Morales que me pregunta por que no seguí lo que me indico.

    miércoles, 1 de julio de 2015 17:33
  • ahhh, jeje, por eso es que no entendia

    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 1 de julio de 2015 17:34
  • ahhh, jeje, por eso es que no entendia

    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jajaja Ahora sí...te consulto de nuevo por que no veo que hayas hecho otra cosa de lo que hago aquí y sin embargo me devuelve un uno cuando en realidad me tendría que devolver el valor de la tabla.

     public int CargarFecha()
            {
                con = new SqlConnection(@Properties.Settings.Default.ConnectionString);
                con.Open();
    
                SqlCommand cmd = new SqlCommand("INSERT INTO Torneos  (Dia,Torneo,Modalidad,Serie,Buyin,Rebuy,PuntosPorRebuy,Addon,PuntosPorAddon,Stack,Cupo,Ciegas,Premio,CasinoId,GaleriaImagenesId,CategoriaId,SpTorneoId,Nivel,RegistroWeb,RegistroAnticipadoDias,Streaming,Ranking,BonusRanking,Pozo,Comision,Link,Descripcion) VALUES (@Dia,@Torneo,@Modalidad,@Serie,@Buyin,@Rebuy,@PuntosPorRebuy,@Addon,@PuntosPorAddon,@Stack,@Cupo,@Ciegas,@Premio,@CasinoId,@GaleriaImagenesId,@CategoriaId,@SpTorneoId,@Nivel,@RegistroWeb,@RegistroAnticipadoDias,@Streaming,@Ranking,@BonusRanking,@Pozo,@Comision,@Link,@Descripcion) SELECT SCOPE_IDENTITY()", con);
    
                cmd.Parameters.AddWithValue("@Dia", dtpFechaDelTorneo.Value);
                cmd.Parameters.AddWithValue("@Torneo", "CAP");
                cmd.Parameters.AddWithValue("@Modalidad", "Freezeout");
                cmd.Parameters.AddWithValue("@Serie", "CAP");
                cmd.Parameters.AddWithValue("@Buyin", 6000.00);
                cmd.Parameters.AddWithValue("@Rebuy", 0);
                cmd.Parameters.AddWithValue("@PuntosPorRebuy", 0);
                cmd.Parameters.AddWithValue("@Addon", 0);
                cmd.Parameters.AddWithValue("@PuntosPorAddon", 0);
                cmd.Parameters.AddWithValue("@Stack", 0);
                cmd.Parameters.AddWithValue("@Cupo", 0);
                cmd.Parameters.AddWithValue("@Ciegas", 0);
                cmd.Parameters.AddWithValue("@Premio", 0);
                cmd.Parameters.AddWithValue("@CasinoId", 0);
                cmd.Parameters.AddWithValue("@GaleriaImagenesId", 0);
                cmd.Parameters.AddWithValue("@CategoriaId", 1);
                cmd.Parameters.AddWithValue("@SpTorneoId", 0);
                cmd.Parameters.AddWithValue("@Nivel", 0);
                cmd.Parameters.AddWithValue("@RegistroWeb", 0);
                cmd.Parameters.AddWithValue("@RegistroAnticipadoDias", 0);
                cmd.Parameters.AddWithValue("@Streaming", 0);
                cmd.Parameters.AddWithValue("@Ranking", 0);
                cmd.Parameters.AddWithValue("@BonusRanking", 0);
                cmd.Parameters.AddWithValue("@Pozo", 0);
                cmd.Parameters.AddWithValue("@Comision", 0);
                cmd.Parameters.AddWithValue("@Link", 0);
                cmd.Parameters.AddWithValue("@Descripcion", 0);
    
                return Convert.ToInt32(cmd.ExecuteNonQuery());
    
                MessageBox.Show("Se ha cargado la fecha del torneo");
                txtFileName.Enabled = true;
                btnCargarArchivo.Enabled = true;
                txtCargaJugadores.Enabled = true;
            }

    En negrita te marque lo que agregue...ahora una consulta más también si no es mucha molestia, se le puede definir que valor deseo obtener?

    Me puede estar faltando algo??
    • Editado mar21_aet miércoles, 1 de julio de 2015 17:39
    miércoles, 1 de julio de 2015 17:38