Vous êtes sur la page 1sur 5

C# ADO.

NET Parte 4 Actualizacin Informacin Ms Access


Introduccin Este articulo intenta brindar un ejemplo practico de como hacer uso de los objetos de ADO.NET para poder manipular la informacin de la base de datos, en este caso ser de Ms Access. Gran parte de la explicacin se ha realizado en artculos previos C# ADO.NET Parte 3 Actualizacin Informacin Sql Server que si bien tratan otra base de datos, se vera que salvo algunos pequeos detalles es prcticamente idntico. Es por eso que a medida que se vaya analizando el cdigo del articulo es recomendable darle un vistazo al link de la Parte 3 del articulo, este contendr detalles mas precisos sobre algunos aspectos utilizados. 1 Creacin nueva entidad (Insert) En este cdigo encontraran tambin el mtodo Save() el cual ser el encargado de determinar si es necesario insertar el registro o simplemente actualizarlos 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); } Si se analiza el cdigo veras que la funcionalidad que determina si existe la entidad es idntica a como se programara cuando se hace uso de Sql Server, el nico cambio radica en que se utiliza los objeto de OleDb 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 (OleDbConnection conn = new OleDbConnection(ConfigurationManager.ConnectionStrings["default"].ToString())) { OleDbCommand command = new OleDbCommand(sql, conn); command.Parameters.AddWithValue("Id", Id); conn.Open(); int count = Convert.ToInt32(command.ExecuteScalar()); if (count == 0) return false; else return true; } } al igual que el ejemplo del link relacionado, se hace uso de ExecuteScalar, el cual devolver simplemente la primer columna de la primer fila de la consulta. LA funcionalidad que inserta tiene un pequeo detalles que hay que aclararlo ya que puede presentarse problemas en otras circunstancias. Este se presenta al declarar el parmetro de fecha de nacimiento (lneas 28-30), se vera que se crea una variable del tipo OleDbParameter en donde se define el tipo de dato puntualmente. Esto debe ser as ya que el mtodo AddWithValue() no puede determinar para este tipo de dato cual es el correcto, cuando se le pasarle un objeto del tipo DataTime de .net, es por eso que hay que definirlo OleDbType.Date, y de esta forma funciona perfectamente. 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 (OleDbConnection conn = new OleDbConnection(ConfigurationManager.ConnectionStrings["default"].ToString())) { int NextId = MaxId() + 1; OleDbCommand command = new OleDbCommand(sql, conn); command.Parameters.AddWithValue("Id", NextId); command.Parameters.AddWithValue("Nombre", contacto.Nombre); command.Parameters.AddWithValue("Apellido", contacto.Apellido); OleDbParameter param = new OleDbParameter("FechaNacimiento", OleDbType.Date); param.Value = contacto.FechaNacimiento; command.Parameters.Add(param); 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; } } Tambin se veras que la funcin MaxId() que permite recuperar el ultimo id ingresado no sufre cambio alguno con respecto a utilizado en una base de datos Sql Server private static int MaxId() { string sql = @"SELECT MAX(IdContacto) FROM Contacto";

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

OleDbCommand command = new OleDbCommand(sql, conn); conn.Open(); return Convert.ToInt32(command.ExecuteScalar()); } } 2 Actualizacin de la entidad (Update) En la operacin de actualizacin hay que remarcar dos puntos que son importantes y generan cambio con respecto a su equivalente en Sql Server Uno al igual que como sucedi en la funcionalidad de Insert, es necesario definir el tipo de dato explicito para la fecha de nacimiento. El segundo aspecto se refiere a que si bien hasta ahora pensbamos que los nombres de los parmetros guardaban una conexin, bajo la operacin del actualizacin nos damos cuenta que no es tan as. Es por ello que se notara que la creacin de parmetros en este caso el Id ha sido declarado al final del resto, mientras que en si equivalente para Sql Server podra haber sido declarado en cualquier posicin. Esto marca un punto importante durante la actualizacin y es que el nombre sirve para tener una referencia a que parmetro estamos asignando el valor, pero para el provider de base de datos OleDb, lo que importa es la posicin del parmetro en coleccin de Parameters. Si en este cdigo se declarar el parmetro Id en primer lugar la actualizacin no se realizara adecuadamente. 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 (OleDbConnection conn = new OleDbConnection(ConfigurationManager.ConnectionStrings["default"].ToString())) { OleDbCommand command = new OleDbCommand(sql, conn); command.Parameters.AddWithValue("Nombre", contacto.Nombre);

command.Parameters.AddWithValue("Apellido", contacto.Apellido); OleDbParameter param = new OleDbParameter("FechaNacimiento", OleDbType.Date); param.Value = contacto.FechaNacimiento; command.Parameters.Add(param); 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); command.Parameters.AddWithValue("Id", contacto.IdContacto); conn.Open(); int rows = command.ExecuteNonQuery(); return contacto; }

3 Eliminacin de la entidad (Delete) Esta operacin no sufre cambio alguno con respecto a su equivalente en Sql Server, salvo los objetos de ado.net utilizados. public static void Delete(int Id) { string sql = @"DELETE FROM Contacto WHERE [IdContacto] = @Id";

using (OleDbConnection conn = new OleDbConnection(ConfigurationManager.ConnectionStrings["default"].ToString())) { OleDbCommand command = new OleDbCommand(sql, conn); command.Parameters.AddWithValue("Id", Id); conn.Open(); command.ExecuteNonQuery(); }

Vous aimerez peut-être aussi