Realizar Operaciones de Insercion, Eliminacion y Actualizacion (CRUD) en una Base de Datos MySQL
Requisitos
Para esta vez lo que vamos a requerir es:
MySQL 5.0.x o sup.
Vs 2005, 2008 ó C# 2005 Express
Conector MySQL para Vs
Y por supuesto tener el conocimiento de cómo se hace para establecer una conexión con el servidor, si aun no lo poseen, revisen la entrada que hice hace un tiempo sobre cómo hacer la conexión.
Manos a la Obra
Lo primero es conectarnos a MySQL desde la consola y crear una base de datos llamada Video, con una tabla llamada Cliente, la tabla debe de poseer los siguientes campos:
- idCliente del tipo Int y que sea Autonumerico
- CI del tipo Int
- Apellido del tipo varchar(45)
- Nombre del tipo varchar(45)
- Teléfono del tipo Int
Ya con todo creado en la base de datos y también llenado con algunos datos, ahora nos vamos al Vs y creamos un proyecto nuevo para C# con el nombre que queramos, ya creado el proyecto procedemos a agregar los siguientes controles al formulario:
- Button
- DataGridView
- TextBox
- Label
El formulario lo debemos dejar de la siguiente manera:
Ahora como ven en el formulario aun no hemos definido los botones para poder editar y eliminar registros de la BD, la primera idea que se nos podría ocurrir seria el agregar otros dos controles del tipo Button, pero existe un inconveniente relativo a este caso, el cual sería que nos dificultaría el poder identificar la fila que va a ser eliminada o editada, lo cual generaría código no necesario y poco optimo, entonces pensando un poquito más y revisando las propiedades del DataGridView se me ocurre el poner en cada fila una columna donde exista un botón para eliminar y otra columna para un botón editar, esto lo logramos creando dos variables del tipo:
private DataGridViewButtonColumn EditButton;
private DataGridViewButtonColumn DeleteButton;
Y como debemos agregar estos objetos al datagridview cremamos un metodo que realice este trabajo, asi deberia quedar nuestro metodo:
private void CreadorBotones()
{
//---------------- Boton Editar --------------
EditButton.HeaderText = "Editar";
EditButton.Text = "Editar";
EditButton.UseColumnTextForButtonValue = true;
dataGridView1.Columns.Add(EditButton);
//--------------- Boton Eliminar --------------
DeleteButton.HeaderText = "Eliminar";
DeleteButton.Text = "Eliminar";
DeleteButton.UseColumnTextForButtonValue = true;
dataGridView1.Columns.Add(DeleteButton);
}
Ya con los botones creados, cuando nos conectemos deberia de quedar de la siguiente manera:
Ahora ya tenemos todos los controles necesarios para poder realizar nuestras tres operaciones sobre la base de datos.
Operación Delete
En esta operación, al ser parte el botón del datagridview, nos vamos a la interfaz de diseño y luego en la ventana de propiedades nos vamos a la sección de eventos, ahí buscamos el evento CellContentClick y le damos doble click, esto nos llevara automáticamente al código, en donde ponemos:
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
currentRow = int.Parse(e.RowIndex.ToString());//Obtiene la fila actual
if (dataGridView1.Columns[e.ColumnIndex] == EditButton)//compara si es boton de edicion o eliminacion
{
textBox1.Text = Convert.ToString(dataGridView1[3, currentRow].Value);
textBox2.Text = Convert.ToString(dataGridView1[4, currentRow].Value);
textBox3.Text = Convert.ToString(dataGridView1[5, currentRow].Value);
textBox4.Text = Convert.ToString(dataGridView1[6, currentRow].Value);
accion = 1;
}
else
{
try
{
conn.Open();
cmd.CommandText = "DELETE FROM Cliente WHERE idCliente=" + dataGridView1[2, currentRow].Value.ToString();
int rowAffected = cmd.ExecuteNonQuery();
conn.Close();
actualizar();
}
catch (MySqlException ex)
{
MessageBox.Show("Error: " + ex.ToString(), "Error de Tiempo de Ejecucion", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
Analicemos un poco el código, lo primero que hacemos es obtener el valor de la fila donde sucedió el evento y lo guardamos en la variable currentRow, después en la instrucción if revisamos si presionamos el botón editar o eliminar, si precionamos el botón editar lo que hacemos es llenar las cajas de texto con los datos de la tabla, pero si hicimos click en el botón eliminar, lo que sucede es lo siguiente:
- Abrir conexión
- Al comando en su campo commandText asignarle la consulta SQL de eliminación de fila.
- Ejecutar la consulta a través del método ExecuteNonQuery
- Cerrar Conexión
Para determina el valor de el IdCliente, para completar la consulta SQL lo que hacemos es poner el nombre del DataGridView seguido de corchetes y entre los corchetes poner los índices y gracias a su propiedad value obtenemos el dato, pero como el campo commandText solo recibe String, convertimos el valor del campo value a String a través del método ToString().
Operación Update
Para la operación Update lo que hacemos es generar el evento asociado al botón “Guardar Cambios”, donde ahí ponemos el siguiente código:
private void button3_Click(object sender, EventArgs e)
{
try
{
if (accion == 1)
{
conn.Open();
cmd.CommandText = "UPDATE Cliente SET ci=" + textBox1.Text + ", Apellido='" + textBox2.Text + "', Nombre='" + textBox3.Text + "', Telefono=" + textBox4.Text + " WHERE idCliente=" + dataGridView1[2, currentRow].Value.ToString();
int rowAffected = cmd.ExecuteNonQuery();
conn.Close();
actualizar();
limpiar();
}
}
catch (MySqlException ex)
{
MessageBox.Show("Error: " + ex.ToString(), "Error de Tiempo de Ejecucion", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
Analizando nuevamente este segmento de código podemos observar que se siguen los mismos pasos que se siguieron para la operación Delete, a diferencia de la cadena SQL, donde hay que asignar a cada campo un valor y este valor hay que obtenerlo de las cajas de texto a través de su campo .Text.
Operación Insert
Esta operación la deje a propósito al último ya que posee una característica interesante, como sabemos en toda tabla dentro de una base de datos, siempre debe de existir un campo que sea el identificador, este campo nunca debe de repetirse por lo cual en la mayoría de los casos es un campo Auto numérico, esto quiere decir que el DBMS es quien le asigna un valor y no nosotros como hacemos en otros campos, esto entonces viene a ser una dificultad, un primer intento de solución tal vez sería omitir el campo idCliente, pero si hacemos esto el sistema nos lanzara una excepción indicándonos que falta un campo o que los campos no están de manera correlativa, entonces nos preguntamos cómo lo hacemos????? Y la respuesta seria la siguiente:
Tienes que parametrizar tu comando y darle como propiedad el que mantenga la versión de datos de la fila de manera original.
Eso se hace de la siguiente forma:
cmd.Parameters.Add("@idCliente", MySqlDbType.Int16, 11, "idCliente").SourceVersion = DataRowVersion.Original;
El primer termino es el nombre del parametro, por lo general siempre debe de estar antecedido por el simbolo de @, el segundo termino es el tipo de dato, este tipo debe de ser siempre igual al que se definio en la BD, como recordamos definimos al campo como Int, entonces aquí se lo tiene que poner como Int16, despues hay que poner el tamaño, que en este caso seria 11, este valor hay que revisarlo u obtenerlo del manual del DBMS o si en algun caso especial nosotros definieramos el tamaño, ahí deberia de ir ese tamaño, pero por regla general para los Int es el valor de 11 y ahora el ultimo termino corresponde al nombre del campo de la base de datos, en nuestro caso IdCliente.
Si ahora recordamos, a parte de parametrizar teniamos que modificar una propiedad de este para que mantenga la versión de datos de la fila de manera original, esto se lo hace asiganado al final del parámetro la instrucción DataRowVersion.Original, esta instrucción es la que permite que el DBMS sea quien asigna los valores para este campo, respetando de esta manera la propiedad autonumerica, antes de que me olvide, la creacion del parametro como lo vimos debe de ir dentro del metodo CrearConexion().
Ahora veamos el resto de codigo:
private void button2_Click(object sender, EventArgs e)
{
try
{
conn.Open();
cmd.CommandText = "INSERT INTO Cliente VALUES(@idCliente," + textBox1.Text + ",'" + textBox2.Text + "','" + textBox3.Text + "'," + textBox4.Text + ")";
int rowAffected = cmd.ExecuteNonQuery();
actualizar();
conn.Close();
}
catch (MySqlException ex)
{
MessageBox.Show("Error: " + ex.ToString(), "Error de Tiempo de Ejecucion", MessageBoxButtons.OK, MessageBoxIcon.Error);
conn.Close();
}
}
Analizando el evento vemos que es al igual que los otros dos comparte una estructura similar y que solo cambia en la consulta SQL. Como se observa en la consulta se puso el parámetro que creamos hace un rato, seguido del resto de valores que obtenemos de las cajas de texto.
Con esto tendríamos todas las operaciones completas, pero para que se puedan visualizar los cambios en nuestra aplicación, creamos dos métodos extras llamados Actualizar () y Limpiar ().
El método Actualizar realiza la operación de recargar los datos de la BD y refrescar el DataGridView, mientras que limpiar lo único que hace es borrar los datos de las cajas de texto para que no de la sensación de que no surtieron efecto los cambio.
private void limpiar()
{
textBox1.Text = String.Empty;
textBox2.Text = String.Empty;
textBox3.Text = String.Empty;
textBox4.Text = String.Empty;
}
private void actualizar()
{
adaptador.SelectCommand.CommandText = "Select * from cliente";
tabla.Clear();
adaptador.Fill(tabla);
dataGridView1.Update();
}
Un par de apuntes interesantes antes de finalizar, el primero es que todas las operaciones que hagamos con el DBMS siempre deben de ir dentro de un bloque Try – Catch – throw ya que a veces pueden suscitarse errores en la conexión con el DBMS y no es optimo que nuestro programa pierda el control y se cuelgue.
El segundo punto es que no se uso esta vez el Objeto DataSet, ya que significaba un uso más complejo de los parámetros, un punto en contra de no usar el DataSet es que para cada operación se abre y cierra un conexión con el DBMS y esto genera que el DBMS se pueda saturar cuando hay demasiada concurrencia.
Bueno espero que les sirva, bye =)
El método de crear botón , en que parte del código lo agregas
ResponderEliminara ya vi, donde se deben de agregar en el constructor.
ResponderEliminarSolo he regresado para agradecer me sirvió de mucho para conocer mas la forma de operar un dataGridView. Prácticamente es lo que necesitaba saber. Buen Día y gracias por compartir sos grande
ResponderEliminarbuena
ResponderEliminar:O
ResponderEliminar