Autor Tema: (Aporte) Comprobar si Existe Registro en BD C# - VB.Net  (Leído 9679 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cristiantorres

  • Sv Jr.
  • **
  • Mensajes: 76
  • Bendiciones para todos
    • Blog dedicado a la programacion
(Aporte) Comprobar si Existe Registro en BD C# - VB.Net
« : julio 26, 2012, 04:08:41 pm »
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.
Comprobar si un registro existe por medio del id.
Recuperar el ultimo id ingresado e ir incrementándolo.
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.


La aplicacion tiene el siguiente diseño.


Ahora empezamos a programar aclaro que solo explicare el ejemplo en c#(por motivos de pereza jeje) pero en mi blog podrán encontrar la explicación y descarga tanto en c# como vb.net.

Agreguemos una clase 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.
Código: [Seleccionar]
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;
    }
 }

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
Código: [Seleccionar]
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;
    }
}

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.
Código: [Seleccionar]
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());
    }
}

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.
Código: [Seleccionar]
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...");
        }
    }
}
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.
Código: [Seleccionar]
private void Form1_Load(object sender, EventArgs e)
{
    dataGridView1.DataSource = Datos.Cargar();
}

Lo único 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.
Código: [Seleccionar]
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...");
    }
}

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

Ahora en el evento del botón que usaremos para agregar un nuevo registro tendremos lo siguiente.
Código: [Seleccionar]
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...");
        }
    }
}

Antes de ingresar hacemos 2 validaciones primero comprobamos que el los datos del id y la edad sean numéricos y también 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.




Eso es todo saludos...  :thumbsup:

Pueden descargar los ejemplos desde mi blog.
http://cristiantorresalfaro.blogspot.com/2012/07/comprobar-si-existe-registro-en-bd-c.html
Visita mi Blog C#, Asp.Net, Python y mas...
http://cristiantorresalfaro.blogspot.com
http://codemania.tk

Desconectado Non Servium

  • Sv Member
  • ***
  • Mensajes: 426
  • Ilix Punx :)
Re:(Aporte) Comprobar si Existe Registro en BD C# - VB.Net
« Respuesta #1 : julio 26, 2012, 08:27:05 pm »
esta bien para aprender :)
Tenes paciencia para poner post como estos  :thumbsup:
Solo unas cuantas cositas:

recomendaciones
-No usar clases estáticas a menos que sea necesario. Tenes todos los métodos y variables cargados a lo largo que la aplicación esté abierta.
-Usar control de excepciones (try) como usaste en Insert. Con unas cuantas correcciones
Código: [Seleccionar]
try
{
    SqlDataAdapter adap;
    DataTable dt = new DataTable();
    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString()))
    {       
        adap = new SqlDataAdapter("SELECT * FROM PERSONAS ORDER BY Id ASC", conn);
        adap.Fill(dt);
        mensaje = String.Empty;
    }
}
catch (Exception ex)
{
    mensaje = ex.Message;
}
finally
{
    adap.Dispose();
}
return dt;
        1 Te ahorras el SqlCommand.
        2 Liberas espacio de memoria de SqlDataAdapter
        3 controlas errores en una variable global de la clase para llamarla luego if (dt == null) MessageBox.Show(Datos.mensaje); else DataGridView1.DataSource = dt;
-No sé que harás en Datos.IsNumeric(txtcomprobar.Text) pero hay clases que ya hacen esto. ej:
Código: [Seleccionar]
Int32 id;
if (!Int32.TryParse(txtcomprobar.Text, out id))//Comprueba si no puede convertir un número a entero
{
    MessageBox.Show("No numero");
}
else
{//Si es número y está asignado a id para evitar estar usando Convert.To--
    //TO DO
    //Insert(id, etc, etc...);
}

Código: [Seleccionar]
MessageBox.Show("Ingres un Valor Numerico...");-¿a donde? mensajes más descriptivos
-Y quizá la más cruda, no me ayuda mucho realmente tener una clave "Id" autoincrementandola si SQL Server puede hacerlo por si mismo :\
Tu tema debería ir aplicado a registros que existen cuando no son "escalables", por ejemplo codigo de empleado, nombre de país, llaves formadas por más de un campo (ej: Cancion y Id_Autor por ejemplo)

preguntas
Código: [Seleccionar]
if (!Datos.IsNumeric(txtid.Text) | !Datos.IsNumeric(txtedad.Text))
-¿el "|" no debería ser un "||"?

Sugerencias
-Linq
-Entity Framework

Herramientas muy muy poderosas y actuales... ¿qué caso tiene usar VS2010 si el SqlCommand viene desde .NET 2003?

nota: los códigos que puse no sé si está buena la sintaxis pero si se entiende la idea :)
♫ Condenados a perder la libertad! Por no acatar las leyes que les asignaron. ♪ ♫
Decididos, decididos a emprender! Un camino largo y duro por no ser esclavos ♫


Watch

Desconectado cristiantorres

  • Sv Jr.
  • **
  • Mensajes: 76
  • Bendiciones para todos
    • Blog dedicado a la programacion
Re:(Aporte) Comprobar si Existe Registro en BD C# - VB.Net
« Respuesta #2 : julio 27, 2012, 08:38:10 pm »
Gracias por los tips si se me pasaron algunas cosas ya que le articulo lo hice porque alguien me pidió ayuda con respecto a esto.

Y en efecto yo uso entity framework y linq cuando hago algún proyecto, pero todavía hay quienes programan usando ado.net.
Visita mi Blog C#, Asp.Net, Python y mas...
http://cristiantorresalfaro.blogspot.com
http://codemania.tk