Sunteți pe pagina 1din 6

C# ADO.

NET Parte 3 Actualizacin Informacin Sql Server


Introduccin En esta oportunidad avanzaremos un poco mas all en el uso de ADO.NET para el trabajo con la informacin, es por eso que no solo recuperaremos datos, sino que tambin agregaremos nuevos registros, actualizaremos los existentes y eliminaremos aquellos que ya no sean necesarios Este post es la continuacin de un post anterior: C# ADO.NET - Parte 1 - Recuperar Informacin Sql Server es por ello que ciertos aspectos sern pasados por alto, pues fueron explicados con mas detalle en la primer parte. 1 Creacin nueva entidad (Insert) Para esta operacin se ha creando en la clase ContactosDAL, varias funciones que encapsulan la funcionalidad. Encontraran un mtodo de nombre Save(), el cual es el nico visibilidad publica en la clase que permite la actualziacion de la entidad, y es por este que se decide si la operacin a llevar a cabo ser en definitiva un Update() o un Insert() public static ContactoEntity Save(ContactoEntity contacto) { if (string.IsNullOrEmpty(contacto.Nombre)) throw new BusinessException(Messages.MSG1002); if (string.IsNullOrEmpty(contacto.Apellido)) throw new BusinessException(Messages.MSG1003); if (Exists(contacto)) return Update(contacto); else return Insert(contacto); } El mtodo Save() es bastante simple, hace uso de una funcin interna de nombre Exists(), para decidir si el contacto como entidad enviado desde la presentacin es uno nuevo, o si existe y hay que actualizarlo private static bool Exists(ContactoEntity contacto) { if (contacto == null) throw new BusinessException(Messages.ERR1001); return Exists(contacto.IdContacto); } private static bool Exists(int Id) {

string sql = @"SELECT COUNT(*) FROM Contacto WHERE IdContacto = @Id";

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString())) { SqlCommand command = new SqlCommand(sql, conn); command.Parameters.AddWithValue("Id", Id); conn.Open(); int count = Convert.ToInt32(command.ExecuteScalar()); if (count == 0) return false; else return true; } } La estructura de conexin y creacin de objetos se respeta al igual que se comento en el primer articulo escrito, la diferencia en este es que se hace uso del ExecuteScalar del objeto SqlCommand. Como se observara este mtodo ideal para estos casos, ya que es utilizado cuando se necesita recuperar un solo valor de la base de datos. El mtodo ExecuteScalar: - Ejecuta la consulta y devuelve la primera columna de la primera fila del conjunto de resultados que devuelve la consulta. Se omiten todas las dems columnas y filas. - Utilice el mtodo ExecuteScalar para recuperar un nico valor (por ejemplo, un valor agregado) de una base de datos. En este caso se esta preguntando cuantos registro hay con el id de contacto que le pasamos como parmetro, si devuelve cero quiere decir que no existe el contacto, en cambio un valor de uno indica que existe por lo tanto debe proceder con la actualizacin. Como se notara el mtodo Exists() esta sobrecargado, o sea tiene dos definiciones del mismo pero con distintos parmetros, uno recibe la instancia de un contacto, mientras que al segundo solo el id, es mas el primero termina haciendo uso de siguiente para reutilizar la funcionalidad, y solo codificarla en uno de ellos. Una vez determinado si existe o no el registro se proceder con las operaciones, por ejemplo el Insert() private static ContactoEntity Insert(ContactoEntity contacto) { string sql = @"INSERT INTO Contacto ([IdContacto]

,[Nombre] ,[Apellido] ,[FechaNacimiento] ,[Localidad] ,[Calle] ,[Numero]) VALUES (@Id, @Nombre, @Apellido, @FechaNacimiento, @Localidad, @Calle, @Numero)";

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString())) { int NextId = MaxId() + 1; SqlCommand command = new SqlCommand(sql, conn); command.Parameters.AddWithValue("Id", NextId); command.Parameters.AddWithValue("Nombre", contacto.Nombre); command.Parameters.AddWithValue("Apellido", contacto.Apellido); command.Parameters.AddWithValue("FechaNacimiento", contacto.FechaNacimiento); command.Parameters.AddWithValue("Localidad", string.IsNullOrEmpty(contacto.Localidad) ? (object)DBNull.Value : contacto.Localidad); command.Parameters.AddWithValue("Calle", string.IsNullOrEmpty(contacto.Calle) ? (object)DBNull.Value : contacto.Calle); command.Parameters.AddWithValue("Numero", contacto.Numero.HasValue ? contacto.Numero : (object)DBNull.Value ); conn.Open(); command.ExecuteNonQuery(); contacto.IdContacto = NextId; return contacto; }

Durante la creacin del registro hay una operacin previa que debe realizarse, y esta consiste en obtener el id siguiente de la clave de la entidad a insertar. Es por ello que se creo el mtodo MaxId() private static int MaxId() {

string sql = @"SELECT MAX(IdContacto) FROM Contacto";

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString())) { SqlCommand command = new SqlCommand(sql, conn); conn.Open(); return Convert.ToInt32(command.ExecuteScalar()); } } Este es un mtodo muy simple que tambin hace uso del ExecuteScalar() para obtener el nico valor devuelto para la funcin de agregacin que se ejecuta en la consulta sql, en este caso se utiliza la funcin Max, para recuperar el ultimo id de la tabla utilizada en la consulta. Adems de obtener el prximo id, durante el proceso de insertar se validan ciertos campos, para verificar si estos contiene informacin asignada, pero en caso de no tenerla se enva a la db el valor DBNull.Value, esto se puede hacer ya que los campos donde se realiza la operacin permiten valores nulos como contenido. Como este es un proceso de insert y la clave es generada de forma interna a la aplicacin, es por esta razn que el final se actualiza la entidad pasada por parmetro y es devuelta para que el sistema pueda informarlo al usuario, ya sea en un mensaje de texto, o para registrar la operacin en algn sistema de log, si fuera necesario. 2 Actualizacin de la entidad (Update) El proceso de actualizacin es bastante similar al de creacin de la entidad, solo varia en que este requiere que la entidad exista, se tenga el identificador o cdigo para poder identificarlo private static ContactoEntity Update(ContactoEntity contacto) { string sql = @"UPDATE Contacto SET [Nombre] = @Nombre ,[Apellido] = @Apellido ,[FechaNacimiento] = @FechaNacimiento ,[Localidad] = @Localidad ,[Calle] = @Calle ,[Numero] = @Numero WHERE [IdContacto] = @Id";

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString())) {

SqlCommand command = new SqlCommand(sql, conn); command.Parameters.AddWithValue("Id", contacto.IdContacto); command.Parameters.AddWithValue("Nombre", contacto.Nombre); command.Parameters.AddWithValue("Apellido", contacto.Apellido); command.Parameters.AddWithValue("FechaNacimiento", contacto.FechaNacimiento); command.Parameters.AddWithValue("Localidad", string.IsNullOrEmpty(contacto.Localidad) ? (object)DBNull.Value : contacto.Localidad); command.Parameters.AddWithValue("Calle", string.IsNullOrEmpty(contacto.Calle) ? (object)DBNull.Value : contacto.Calle); command.Parameters.AddWithValue("Numero", contacto.Numero.HasValue ? contacto.Numero : (object)DBNull.Value); conn.Open(); command.ExecuteNonQuery(); return contacto; } } A diferencia del proceso de creacin de la entidad en esta oportunidad no es creado un nuevo Id, sino que este debe enviarse para que la actualizacin pueda realizarse correctamente. Es mas esta Id es utilizado en la seccin WHERE de la consulta para poder identificar el registro que se quiere actualizar. 3 Eliminacin de la entidad (Delete) Para este proceso una vez que se tiene la entidad simplemente se enva el id y eso es todo. public static void Delete(ContactoEntity contacto) { if (contacto == null) throw new BusinessException(Messages.ERR1001); Delete(contacto.IdContacto); } public static void Delete(int Id) { string sql = @"DELETE FROM Contacto WHERE [IdContacto] = @Id";

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["default"].ToString())) { SqlCommand command = new SqlCommand(sql, conn); command.Parameters.AddWithValue("Id", Id);

conn.Open(); command.ExecuteNonQuery(); } } Consideracin sobre el ejemplo Algo que se notara cuando se analice la aplicacin es que fue eliminado el DataSet del ejemplo previo en el post anterior, dejando nicamente el uso de la entidad como clase, esto se debi a que era necesario uniformizar la aplicacin para tratar con solo un tipo de entidad, y poder as conservar esta cuando se esta en modo edicin. Se vera a nivel de presentacin una propiedad que representa la entidad seleccionada, el tener o no un objeto que representa al contacto marca el modo en que se encuentra la aplicacin, ya que al hacer dobleclick en una entidad de la grilla esta carga el contenido y asigna un valor en este propiedad interna del formulario Los ejemplos requieren al menos Sql Server 2008 Express instalado localmente

S-ar putea să vă placă și