ProgramaciĆ³n, TecnologĆ­a y MĆ”s...

ProgramaciĆ³n, TecnologĆ­a y MĆ”s...

Comprobar si Existe Registro en BD C# - VB.Net

He notado con frecuencia en los diferentes foros de programaciĆ³n que hay en la web preguntar como saber si un registro existe en la bd, como tambiĆ©n recuperar el id de un registro desde el cĆ³digo de nuestra aplicacion pues bien en este articulo se explicara como hacerlo.

En este articulo trataremos los siguientes puntos.
  1. Comprobar si un registro existe por medio del id.
  2. Recuperar el ultimo id ingresado e ir incrementƔndolo.
  3. Comprobar Datos antes de ingresar un registro.

El ejemplo esta desarrollado en visual estudio 2010 en c# y vb.net y se usa sqlexpres 2008.

Para este ejemplo uso una base de datos llamada Database que cuenta con una tabla Personas.

BD

La aplicacion tiene el siguiente diseƱo.

DiseƱo

Ahora a programar agreguemos una clase(modulo en el caso de vb.net) a nuestro proyecto llamado Datos aquĆ­ tendremos todos los mĆ©todos que usaremos para que desde el cĆ³digo de nuestro formulario solo los llamemos.

Veamos primeramente el mƩtodo que se encargara de cargar todos los datos de nuestra bd.
       public static DataTable Cargar()
     {
         using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
         {
             DataTable dt = new DataTable();
             string query = "SELECT * FROM PERSONAS ORDER BY Id ASC";
             SqlCommand cmd = new SqlCommand(query, conn);
             SqlDataAdapter adap = new SqlDataAdapter(cmd);
             adap.Fill(dt);
             return dt;
         }
     }

    Public Function Cargar() As DataTable
     Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())
         Dim dt As New DataTable()
         Dim query = "SELECT * FROM PERSONAS ORDER BY Id ASC"
         Dim cmd As New SqlCommand(query, conn)
         Dim adap As New SqlDataAdapter(cmd)
         adap.Fill(dt)
         Return dt
     End Using
 End Function

Este cĆ³digo ya es conocido por todos ya que en casi todos mis artĆ­culos los uso para cargar los datos de la bd, es un mĆ©todo que retorna un datatable con todos los datos de la bd.

Ahora veamos el mƩtodo que nos servirƔ para comprobar si un registro existe o no.
      public static bool Existe(int id)
     {
         using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
         {
             string query = "SELECT COUNT(*) FROM PERSONAS WHERE ID=@Id";
             SqlCommand cmd = new SqlCommand(query, conn);
             cmd.Parameters.AddWithValue("Id", id);
             conn.Open();

             int count = Convert.ToInt32(cmd.ExecuteScalar());
             if (count == 0)
                 return false;
             else
                 return true;
         }
     }

    Public Function Existe(ByVal id As Integer) As Boolean
     Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())
         Dim query = "SELECT COUNT(*) FROM PERSONAS WHERE ID=@Id"
         Dim cmd As New SqlCommand(query, conn)
         cmd.Parameters.AddWithValue("Id", id)
         conn.Open()

         Dim count As Integer = Convert.ToInt32(cmd.ExecuteScalar())
         If count = 0 Then
             Return False
         Else
             Return True
         End If
     End Using
 End Function

Tenemos el mĆ©todo Existe que es de tipo bool y que tambiĆ©n recibe un parĆ”metro en este caso sera el id que sera por el cual comprobaremos si el registro existe, vemos que en la consulta a la bd usamos la instrucciĆ³n COUNT que devuelve el numero de registros que existe con ese id, tambiĆ©n usamos el mĆ©todo ExecuteScalar() para comprobar si encontrĆ³ registro con el id si el valor es cero es porque no existe el registro entonces retornamos false y retornamos true si ya existe el registro es decir que si encontrĆ³ registro con ese id.

Ahora veamos como recuperar el ultimo id ingresado, esto lo aremos porque el campo id no es autonumerico por eso necesitamos obtener por medio de cĆ³digo cual sera el prĆ³ximo valor a ingresar.
      public static int RecuperarId()
     {
         using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
         {
             string query = "SELECT  MAX(Id) FROM PERSONAS";
             SqlCommand cmd = new SqlCommand(query, conn);
             conn.Open();

             return Convert.ToInt32(cmd.ExecuteScalar());
         }
     }

    Public Function RecuperarId() As Integer
     Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())
         Dim query = "SELECT  MAX(Id) FROM PERSONAS"
         Dim cmd As New SqlCommand(query, conn)
         conn.Open()

         Return Convert.ToInt32(cmd.ExecuteScalar())
     End Using
 End Function

Tenemos el mĆ©todo RecuperarId que retorna un valor numĆ©rico que sera el valor del ultimo id, vemos que en la query a nuestra bd usamos la funciĆ³n MAX de sql que devuelve el valor mĆ”ximo de un campo de nuestra tabla en este caso el id y por ultimo retornamos ese valor usando nuevamente el mĆ©todo ExecuteScalar.

Por ultimo tenemos el mƩtodo Insert que nos servirƔ para insertar un nuevo registro.
      public static void Insert(int id, string nombre, string apellido, int edad)
     {
         using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
         {
             string query = "INSERT INTO PERSONAS(Id,Nombre,Apellido,Edad) VALUES(@Id,@Nombre,@Apellido,@Edad)";
             id = RecuperarId() + 1;
             SqlCommand cmd = new SqlCommand(query, conn);
             cmd.Parameters.AddWithValue("Id", id);
             cmd.Parameters.AddWithValue("Nombre", nombre);
             cmd.Parameters.AddWithValue("Apellido", apellido);
             cmd.Parameters.AddWithValue("Edad", edad);
             conn.Open();
             try
             {
                 cmd.ExecuteNonQuery();
                 MessageBox.Show("Registro Ingresado con Exito...");
             }
             catch (Exception)
             {
                 MessageBox.Show("Error no se Pudo Ingresar el Registro...");
             }
         }
     }

    Public Sub Insert(ByVal id As Integer, ByVal nombre As String, ByVal apellido As String, ByVal edad As Integer)
     Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("default").ToString())
         Dim query = "INSERT INTO PERSONAS(Id,Nombre,Apellido,Edad) VALUES(@Id,@Nombre,@Apellido,@Edad)"
         id = RecuperarId() + 1
         Dim cmd As New SqlCommand(query, conn)
         cmd.Parameters.AddWithValue("Id", id)
         cmd.Parameters.AddWithValue("Nombre", nombre)
         cmd.Parameters.AddWithValue("Apellido", apellido)
         cmd.Parameters.AddWithValue("Edad", edad)
         conn.Open()
         Try
             cmd.ExecuteNonQuery()
             MessageBox.Show("Registro Ingresado con Exito...")
         Catch ex As Exception
             MessageBox.Show("Error no se Pudo Ingresar el Registro...")
         End Try
     End Using
 End Sub

creamos el mƩtodo Insert y le pasamos los parƔmetros para insertar un nuevo registro, luego hacemos la query a la bd para hacer el insert y le pasamos los parƔmetros de cada campo, algo importante de mencionar es que antes de enviar el parƔmetro del id calculamos su valor haciendo uso del mƩtodo RecuperarId que como dijimos devuelve el valor mƔximo de id entonces a este solo le sumamos 1 para que siempre se vaya incrementado en 1.

Eso seria todo en nuestra clase Datos.

Ahora en el evento load de nuestro formulario cargamos todos los datos.
       private void Form1_Load(object sender, EventArgs e)
     {
         dataGridView1.DataSource = Datos.Cargar();
     }

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     DataGridView1.DataSource = Datos.Cargar()
 End Sub

Lo unico que hacemos es cargar todos los datos de nuestro tabla llamando el mƩtodo.
Cargar.

Ahora en el evento del botĆ³n que usaremos para comprobar si existe el registro tendremos el siguiente cĆ³digo.
      private void btncomprobar_Click(object sender, EventArgs e)
     {
         if (!Datos.IsNumeric(txtcomprobar.Text))
             MessageBox.Show("Ingres un Valor Numerico...");
         else
         {
             if (!Datos.Existe(Convert.ToInt32(txtcomprobar.Text)))
                 MessageBox.Show("Registro No Existe...");
             else
                 MessageBox.Show("Registro Ya Existe...");
         }
     }

    Private Sub btncomprobar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btncomprobar.Click
     If (Not IsNumeric(txtcomprobar.Text)) Then
         MessageBox.Show("Ingres un Valor Numerico...")
     Else
         If (Not Datos.Existe(Convert.ToInt32(txtcomprobar.Text))) Then
             MessageBox.Show("Registro No Existe...")
         Else
             MessageBox.Show("Registro Ya Existe...")
         End If
     End If
 End Sub

Antes de comprobar si existe el registro por medio del id comprobamos que el dato ingresado sea numerico si lo es entonces llamamos al metodo Existe y le pasamos el valor ingresado y mostramos los respectivos mensajes si el id ya existe o no.

Ahora en el evento del boton que usaremos para agregar un nuevo registro tendremos lo siguiente.
      private void btnagrear_Click(object sender, EventArgs e)
     {
         if (!Datos.IsNumeric(txtid.Text) | !Datos.IsNumeric(txtedad.Text))
         {
             MessageBox.Show("Ingres un Valor Numerico...");
         }
         else
         {
             if (!Datos.Existe(Convert.ToInt32(txtid.Text)))
             {
                 Datos.Insert(Convert.ToInt32(txtid.Text), txtnombre.Text, txtapellido.Text, Convert.ToInt32(txtedad.Text));
                 dataGridView1.DataSource = Datos.Cargar();
             }
             else
             {
                 MessageBox.Show("Id Ya Existe...");
             }
         }
     }

    Private Sub btnagrear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnagrear.Click
     If (Not IsNumeric(txtid.Text) Or Not IsNumeric(txtedad.Text)) Then
         MessageBox.Show("Ingres un Valor Numerico...")
     Else
         If (Not Datos.Existe(Convert.ToInt32(txtid.Text))) Then
             Datos.Insert(Convert.ToInt32(txtid.Text), txtnombre.Text, txtapellido.Text, Convert.ToInt32(txtedad.Text))
             DataGridView1.DataSource = Datos.Cargar()
         Else
             MessageBox.Show("Id Ya Existe...")
         End If
     End If
 End Sub

Antes de ingresar hacemos 2 validaciones primero comprobamos que el los datos del id y la edad sean numericos y tambien validamos que el id ingresado no exista si pasa las 2 validaciones agregamos el registro si no mostramos un mensaje que no se pudo agregar.

comprobar


agregar

Eso es todo espero les sirva de algo saludos desde El Salvador.

Descargar Proyecto C#

Descargar Proyecto VB.Net

Si quieren donarme para una soda lo pueden hacer aqui.


Publicar un comentario

10 Comentarios

  1. Hola parce, tengo una consulta, con ese metodo podre consultar cada vez q oprima una tecla?? cosa que actualice a toda hora mientras escribo??? Quiero poner un textbox donde el usuario digita la cedula de la persona y mientras va digitando va buscando los datos. Gracias

    ResponderEliminar
    Respuestas
    1. Pero buscar para que para comprobar si existe o solo para buscar el dato.

      Porque si es para que cuando vayas escribiendo te aparezca los datos podes usar un autocomplete como lo explico aquĆ­.
      AutoComplete en Textbox y ComboBox C#

      Eliminar
  2. Excelente explicaciĆ³n amigo me sirviĆ³ mucho !

    ResponderEliminar
    Respuestas
    1. Gracias y pues me alegro que te sirviera ya que esa es la finalidad de todos mis artĆ­culos.

      Eliminar
  3. esta muy bueno, pero trate de descargar el proyecto en C# pero el link esta roto.... me gustaria bastante poder ojear mas profundamente el codigo entero para ordenar mis ideas........

    ResponderEliminar
    Respuestas
    1. Amigo probĆ© el link y no tiene ningĆŗn problema el enlace te lleva a la web de skydrive donde solo le tienes que dar click al proyecto en c# y listo.

      Saludos.

      Eliminar
  4. Hola Cristian, me parece muy bueno tu blog mas aun cuando me encuentro aprendiendo VB Studio 2010. Queria consultarte lo siguiente, quiero validar a traves de un TextBox1 si el dato existe en un DatagridView1, lo que yo hice fue arrastrar un control datagridview al Form y luego enlazarlo a traves de sus propiedades con mi BD en Sql Server2008 (asi me ahorro codigo), pero no se como comprobar que el dato que esta en el TextBox1.text este en DataGridView1, si existe que diga "Id Existente" de los contrario "Id no Existe". Ojala puedas ayudarme

    Saludos desde Chile

    ResponderEliminar
    Respuestas
    1. Hola, primeramente usar los asistentes del vs no lo veria bien tu dices que te ahorras codigo pero si solo usas asistentes nunca aprenderƔs lo que realmente es programar y al hacerlo por codigo tu tienes mas control sobre la aplicacion.

      Pero pasando a la pregunta para que te vas a complicar queriendo buscar el dato en el datagriedview porque no lo buscas en tu base de datos(ese seria la manera correcta de hacerlo), utiliza el mƩtodo existe que utilizo en el ejemplo y luego como lo utilizo para comprobar que el dato exista o no.

      Saludos.

      Eliminar
    2. Muy buen tutorial cristian...

      Ahora una consulta, es posible insertar datos en una fila de la bbdd que este disponible???

      Estoy desarrollando una aplicacion en donde el usuario pueda eliminar una fila creada a partir del id de la misma.
      La idea es que para insertar una nueva fila lo haga en el primer id disponible(los ids no son autoincrementables).

      Saludos!

      Eliminar
  5. Hola

    No entiendo tu planteamiento y para que quieres hacerlo?

    ResponderEliminar