.NET Chronicles

Temas relacionados con el desarrollo de aplicaciones con .NET

Octavio Telis

Utilidades de Sql Server con ADO.NET – Obtener el valor actual de un campo Identity de una tabla

Hola ¿Qué tal?


Continuando con la serie de utilidades de SQL Server utilizando ADO.NET, toca el turno a una utilidad interesante, esta utilidad nos permitirá consultar el valor actual del campo identity de una tabla.


Obtener el Valor Actual del Campo Identity de una Tabla con T-SQL


Desde T-SQL podemos consultar el valor actual de campo identity de una tabla con la función IDENT_CURRENT, la cual recibe como parámetro el nombre de la tabla. El siguiente ejemplo muestra el uso de esta función:

Use AdventureWorks
Select IDENT_CURRENT(‘Person.Contact’)

El resultado que se muestra es el valor identity actual, que es el último valor de la semilla asignado al campo identity, no hay que confundir el valor del campo identity en el último registro con el valor actual de la semilla de Identity. Esto es, si se captura un nuevo registro cuyo valor Identity es 7 y se borra después, el valor 7 se conservará como el último asignado por Identity a la columna aunque el valor de la misma columna en el último registro no sea el mismo, por lo que podemos asegurar que el siguiente valor será el valor actual de identity + 1 o más el valor del incremento de la semilla, sin embargo, no se puede aseverar que el valor actual del último registro en el campo identity sea el valor que devuelve IDENT_CURRENT pues pueden haberse eliminado el último registro que tomó ese valor.  Hay que tener cuidado con eso, aunque se utiliza más para predecir el próximo valor más que para consultar el valor actual del campo.


Obtener el Valor Actual del Campo Identity de una Tabla con ADO.NET


Ahora bien, será algo sencillo llevar esta utilidad al .NET, simplemente tendremos que utilizar lo que ya hemos utilizado anteriormente en las publicaciones de la serie de utilidades de SQL Server con ADO.NET.


Este método se considera como parte de la clase que estamos construyendo, a la cual he denominado SqlUtilities.


El siguiente ejemplo muestra el código como quedaría de nuestro método para obtener el identity actual.


VB.NET

Public Function GetCurrentIdentity( _
        ByVal TableName As String) As Integer

    ‘Declaramos un SqlCommand para ejecutar la consulta
    Dim cmd As SqlCommand = _
        New SqlCommand(“Select IDENT_CURRENT(@TableName)”)
    ‘Agregamos los parámetros necesarios para la consulta
    cmd.Parameters.Add(“@TableName”, _
            SqlDbType.VarChar, 250).Value = TableName
    ‘Asignamos un objeto connection a nuestro command
    cmd.Connection = cnn
    ‘Intentaremos ejecutar la consulta
    Try
        ‘Abrimos la conexión
        cnn.Open()
        ‘Capturamos el resultado de la consulta
        ‘escalar en una variable
        Dim res As Object = cmd.ExecuteScalar()
        ‘Analizamos si el valor devuelto es bueno
        If res Is System.DBNull.Value Then
            ‘Si no hubo resultados
            ‘devolvemos -1
            Return -1
        Else
            ‘Devolvemos el valor del resultado
            Return CType(res, Integer)
        End If
    Catch ex As SqlException
        ‘Capturamos el error
        mMessages = ex.Message
    Finally
        ‘Se cierra la conexión
        cnn.Close()
    End Try
    ‘Si llega aquí es porque hubo error
    ‘Se devuelve -1
    Return -1
End Function

C#
public int GetCurrentIdentity(string TableName)
{
    //Declaramos un SqlCommand para ejecutar la consulta
    SqlCommand cmd =
        new SqlCommand(“Select IDENT_CURRENT(@TableName)”);
    //Agregamos los parámetros necesarios para la consulta
    cmd.Parameters.Add(“@TableName”,
        SqlDbType.VarChar, 250).Value = TableName;
    //Asignamos un objeto connection a nuestro command
    cmd.Connection = cnn;
    //Intentaremos ejecutar la consulta
    try
    {
        //Abrimos la conexión
        cnn.Open();
       //Capturamos el resultado de la consulta
        //escalar en una variable
        object res = cmd.ExecuteScalar();
        //Analizamos si el valor devuelto es bueno
        if (res == System.DBNull.Value)
            //Si no hubo resultados
            //devolvemos -1
            return 1;
        else
        {
            //Devolvemos el valor del resultado
            return Convert.ToInt32(res);
        }
    }
    catch (SqlException ex)
    {
        //Capturamos el error
        messages = ex.Message;
    }
    finally
    {
        //Se cierra la conexión
        cnn.Close();
    }
    //Si llega aquí es porque hubo error
    //Se devuelve -1
    return 1;
}

Bien, con esto terminamos el ejemplo, lo cual nos deja el método para obtener el valor actual del Identity de nuestra tabla. Para los valores en que no hay resultados, devolvemos -1 como indicador de que no hay un valor identity en la tabla.


Conclusiones


Solo puede haber un campo Identity por tabla  por lo que solo podemos obtener un resultado, existen otras dos maneras de obtener el valor de un identity, una es con la variable de sistema las cuales con @@IDENTITY y SCOPE_IDENTITY, la primera depende de la sesión en que se realiza la consulta, solo tiene valor en la sesión en que se utiliza pero depende de un insert antes para tener un valor, la segunda depende del alcance de la ejecución. La manera que utilizamos es independiente del alcance y de la sesión por lo que devolverá el valor actual en cualquier momento.


Bueno, pues espero que les sea de utilidad y nos vemos en la próxima.


Saludos…


Octavio Telis

4 Responses to Utilidades de Sql Server con ADO.NET – Obtener el valor actual de un campo Identity de una tabla

Leave a Reply

Your email address will not be published. Required fields are marked *


*

.NET Chronicles
  • Eventos del Teclado en WPF July 22, 2015
      Hola ¿qué tal? En esta ocasión como como continuidad a lo que previamente había escrito sobre los eventos del teclado en Windows Forms, haré un artículo sobre el uso de los eventos del teclado en WPF, así es en Windows Presentation Foundation. No es desconocido por muchos que el nuevo estándar de desarrollo de […]
  • Programación Orientada a Objetos (Introducción) May 14, 2014
    Hola qué tal… Aquí les dejo este video sobre la programación orientada a objetos, a manera de preámbulo a los siguientes videos, con las bases de la programación en C# y otra línea con algunas utilerías. Saludos… Octavio Telis
  • Capítulo piloto del la versión en video de .NET Chronicles May 6, 2014
    Hola qué tal??? Pues en esta ocasión estoy compartiendo con ustedes la liga de un video piloto, con el que pretendo comunicar un poco más sobre las tecnologías .NET y los lenguajes de Programación. En esta ocasión será con la presentación de C#, en un capitulo titulado “Te presento a C#”, espero que sea de […]
  • Validación de datos de entrada con enlace a datos en WPF May 27, 2012
    Tweet Hola, qué tal. Ya que he venido hablando del enlace a datos en WPF en las publicaciones anteriores, bien convendría considerar el uso del Binding para validar datos, hemos tocado ya algunos puntos necesarios para escribir esta funcionalidad. En las publicaciones anteriores vimos ya como enlazar los datos, además, cómo convertir los datos, ahora, […]
  • Uso de la propiedad Visibility con valores booleanos en WPF May 25, 2012
    Tweet    Hola que tal. En esta ocasión quiero compartir con ustedes una manera para utilizar la propiedad Visibility con un valor bool. Te preguntarás “¿Y qué sentido tiene eso?”, bien, el detalles está en que en ocasiones se requiere que la visibilidad de un control de la interfaz de usuario responda a un valor […]
  • Conversión de Valores con Enlace a Datos May 24, 2012
    Tweet     Hola que tal. En el diseño de aplicaciones con WPF tendremos muchas ventajas en cuanto a la interfaz de usuario se refiere, dado que es un modelo muy flexible, nos permite dar formato y estilo a la apariencia de la interfaz de usuario, logrando aplicaciones más agradables, vistosas y que mejoran por mucho […]
  • Mostrar archivos de imagen en WPF utilizando enlace a datos. May 23, 2012
    Tweet Holal Qué tal. Continuando con el ejemplo del post anterior (http://bit.ly/oh0m9k), referente al manejo de imágenes en WPF, ejemplificaremos el manejo de las imágenes de la misma manera pero, esta vez, utilizando enlace a datos y la clase Binding. Antes, tenemos que hablar un poco de lo que es el enlace a datos con […]
  • Mostrar archivos de imagen en WPF August 26, 2011
    Hola Qué Tal… En esta ocasión quiero comenzar una serie de artículos sobre el manejo de archivos de imágenes con .NET. En esta primera parte voy a tratar la manera de cargar un archivo de imagen en un contenedor de imagen, en este caso usaré WPF y el control Image que viene incluido en el […]
  • Comparar dos DataTables según sus DataRows August 23, 2011
    Hola que tal. En ocasiones es necesario comparar el contenido de dos DataTable para determinar qué registros (DataRow) están en una y en otra no. Supongamos tenemos dos DataTable; dt1 y dt2, ambas con el mismo esquema. La tabla dt2 contiene más registros que la taba dt1, por lo que deseamos saber qué registros de […]
  • Arquitectura – Definición de un Data Access Component (con un ejemplo) Parte 3 May 14, 2010
    Hola Qué Tal? En esta ocasión, no he dejado pasar tanto tiempo para terminar la trilogía del uso de Data Access Component con un ejemplo. Bien, pues en este artículo veremos el uso del componente ya creado, cómo extenderemos la funcionalidad del componente y cómo lo aplicamos en la interfaz de usuario. Primeramente, debemos crear […]