none
ejecutar IDENT_CURRENT RRS feed

  • Pregunta

  • Buenos días y gracias a quien me responda.

    Llevo ya dandole vueltas a esto un tiempo y aun no he dado con ello. ¿como ejecuto esta consulta sql dentro de un contexto de base de datos de Entity Framework?

    SELECT IDENT_CURRENT('Offer')

    Necesito obtener el ultimo id de una tabla,no vale la funcion Max porque la funcion Max devuelve el ultimo id existente y no el id que va a tener la ultima entidad de tipo Offer que se inserte,me explico :

    Si uso la funcion Max y tengo 6 Offers,esta funion me devuelve id 6,pero si inserto un registro mas y luego lo borro,dicha funcion Max me volverá a devolver 6,pero el metodo Add me insertará una entidad Offer con el id 8 (ya que de alguna manera conoce que se insertó un nuevo id 7 y luego se borró).Para solucionar esto he pensado ejecutar este sencillo SQL para que me devuelva el id real a insertar,he probado la SQL en base de datos y funciona perfecto,si inserto y luego borro,me devuelve el id que necesito.

    Peeeero como ejecuto esta select y meto el resultado en una variable?

    Gracias.

    lunes, 30 de diciembre de 2013 9:06

Respuestas

  • Ya no quedan mas cojo....escorbuto a las elecciones :

                                    string sql = "SELECT IDENT_CURRENT('Offer')";
                                    int ultimo_id = 0;
                                    try
                                    {
                                        var cadena_conexion = System.Configuration.ConfigurationManager.ConnectionStrings["conexionAdo"].ToString();
                                        using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(cadena_conexion))
                                        {
                                            System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand(sql, conn);
                                            conn.Open();
                                            //var resultado = command.ExecuteReader();
                                            ultimo_id = (int)command.ExecuteScalar();
                                            conn.Close();
                                        }
                                    }
                                    catch (Exception E)
                                    {
    
    etc....etc....
    
                                    }
    
    Solucion bien poco elegante mezclar ADO.NET viejo con entidades y demas,pero no se me ocurre otra,si alguien sabe alguna se lo agradezco.
    • Marcado como respuesta polaries viernes, 3 de enero de 2014 8:58
    lunes, 30 de diciembre de 2013 11:07
  • >>necesito los id de las ofertas para poder relacionarlas con valores de atributos que estan en otra tabla y como en >>memoria no existen todavía los ids,pues tengo que buscarlos de alguna manera.

    no necesitas conocer los ids para hacer esto, porque no aplcias la tecnica que usas los dataset tipados

    generan id negativos, o sea cuando crean una entidad ponen de id el -1, y relacionan el resto con ese id

    si crean otra entidad le ponen el -2 (y ais continuan) y relaciona ese id con las otras entidades

    cuando van a insertar solo reemplazan los negativos por los id que genera la db y listo

    ---

    igualmente veo que usas EF lo cual no requiere de ningun id, podrias simplemente relacinar los objetos si haces

    Entidad1 ent1 = new Entidad1();

    ent1.RelacionEnt2 = new Entidad2();

    db.Entidad1.Add(ent1);

    db.Savechange();

    y listo EF se encarga por ti de relacionar y persistir todo junto, sin tener que asignar ningun id

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta polaries viernes, 3 de enero de 2014 8:59
    lunes, 30 de diciembre de 2013 17:11

Todas las respuestas

  • Ya no quedan mas cojo....escorbuto a las elecciones :

                                    string sql = "SELECT IDENT_CURRENT('Offer')";
                                    int ultimo_id = 0;
                                    try
                                    {
                                        var cadena_conexion = System.Configuration.ConfigurationManager.ConnectionStrings["conexionAdo"].ToString();
                                        using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(cadena_conexion))
                                        {
                                            System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand(sql, conn);
                                            conn.Open();
                                            //var resultado = command.ExecuteReader();
                                            ultimo_id = (int)command.ExecuteScalar();
                                            conn.Close();
                                        }
                                    }
                                    catch (Exception E)
                                    {
    
    etc....etc....
    
                                    }
    
    Solucion bien poco elegante mezclar ADO.NET viejo con entidades y demas,pero no se me ocurre otra,si alguien sabe alguna se lo agradezco.
    • Marcado como respuesta polaries viernes, 3 de enero de 2014 8:58
    lunes, 30 de diciembre de 2013 11:07
  • hola

    pero para que necesitas conocer el id ?

    porque se supone que el id se deberia conocer cuando insertas la entidad y no antes


    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 30 de diciembre de 2013 14:29
  • Hola Leandro,porque tengo un jefe.....jejejejej....y como sabe de programación mas que nadie (aunque no vio un compilador en su vida) pues tengo que hacer una pantalla de resumen de lo que el usuario va a grabar en BD,y tengo que poder aceptar y cancelar todo (ademas de grabar en un log todo lo que sale en esa pantalla).....el boton aceptar llamará al método Savechanges() y el cancelar no hará nada.....ya esta hecho y funciona (tema de concurrencia aparte),con lo cual debo mantener todas las entidades que modifica la aplicacion en memoria antes de persistir los cambios,y para ello,cuando se va a insertar una nueva entidad,debo obtener los ids de las entidades que van a ser insertadas para relacionar con otras tablas donde se grabarán esos ids también cuando se llame al metodo savechanges.

    Me explico : necesito los id de las ofertas para poder relacionarlas con valores de atributos que estan en otra tabla y como en memoria no existen todavía los ids,pues tengo que buscarlos de alguna manera.

    Si conoces alguna manera mejor de hacer esto agradecería tu opinión.Más que nada porque el problema de la concurrencia de procesos sigue estando presente,de momento somos muy pocos en la empresa y esto no es problema,ya que la aplicación la usa 1 persona,pero esta pensada para que la usen muchos el dia de mañana y puede que se presente un problema grave cuando varios usuarios utilicen la aplicacion.

    Se me ocurre un caso en el cual dos usuarios crean ofertas,un primero rellena los datos,cuando termina se le muestra la pantalla de resumen (en la carga de esta pantalla es donde esta el codigo anterior donde se obtienen los id),este primero no le da a aceptar,y viene un segundo desde otro pc y crea otra oferta dando a aceptar,creando una oferta con el id que esta calculado en la pantalla que el primero dejó a medias,cuando el primero vuelva y pulse aceptar...pum! error clave duplicada!.

    Algo lei de transacciones y bloqueos de tablas para hacer esto de manera segura pero me llevaría mucho mas tiempo que esta solución temporal.

    Gracias y saludos.
    lunes, 30 de diciembre de 2013 15:29
  • >>necesito los id de las ofertas para poder relacionarlas con valores de atributos que estan en otra tabla y como en >>memoria no existen todavía los ids,pues tengo que buscarlos de alguna manera.

    no necesitas conocer los ids para hacer esto, porque no aplcias la tecnica que usas los dataset tipados

    generan id negativos, o sea cuando crean una entidad ponen de id el -1, y relacionan el resto con ese id

    si crean otra entidad le ponen el -2 (y ais continuan) y relaciona ese id con las otras entidades

    cuando van a insertar solo reemplazan los negativos por los id que genera la db y listo

    ---

    igualmente veo que usas EF lo cual no requiere de ningun id, podrias simplemente relacinar los objetos si haces

    Entidad1 ent1 = new Entidad1();

    ent1.RelacionEnt2 = new Entidad2();

    db.Entidad1.Add(ent1);

    db.Savechange();

    y listo EF se encarga por ti de relacionar y persistir todo junto, sin tener que asignar ningun id

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta polaries viernes, 3 de enero de 2014 8:59
    lunes, 30 de diciembre de 2013 17:11
  • pues muchas gracias,mañana a ver si puedo probar eso y te cuento.
    lunes, 30 de diciembre de 2013 17:58
  • Buenas de nuevo,he intentado probar esa solución,pero si entiendo bien,necesito que el modelo de datos tenga una asociación (relacion) entre la tabla de ofertas y la de valores de atributos para poder hacer :

    ent1.RelacionEnt2 = new Entidad2()

    con lo cual no puedo hacer nada, ya que esa tabla de valores de atributos no puede estar relacionada con nada por expreso deseo de la jefatura,es una tabla aislada en el modelo de datos.

    De todas maneras plantearé un cambio en esa tabla para ver si se puede meter una asociación y hacer lo que dices porque la solución temporal que tengo no me convence nada.

    Saludos y gracias Leandro.
    viernes, 3 de enero de 2014 8:58