Introducción
Este articulo intenta brindar un ejemplo practico de como hacer uso de los objetos de ADO.NET para poder manipular la información de la base de datos, en este caso será de Ms Access.
Gran parte de la explicación se ha realizado en artículos previos
C# – ADO.NET – Parte 3 – Actualización Información Sql Server
que si bien tratan otra base de datos, se vera que salvo algunos pequeños detalles es prácticamente idéntico.
Es por eso que a medida que se vaya analizando el código 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 – Creación nueva entidad (Insert)
En este código encontraran también el método 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 código veras que la funcionalidad que determina si existe la entidad es idéntica a como se programaría 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 pequeño detalles que hay que aclararlo ya que puede presentarse problemas en otras circunstancias.
Este se presenta al declarar el parámetro de fecha de nacimiento (líneas 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 método 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;
}
}
También se veras que la función 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 – Actualización de la entidad (Update)
En la operación de actualización 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 pensábamos que los nombres de los parámetros guardaban una conexión, bajo la operación del actualización nos damos cuenta que no es tan así.
Es por ello que se notara que la creación de parámetros en este caso el “Id” ha sido declarado al final del resto, mientras que en si equivalente para Sql Server podría haber sido declarado en cualquier posición.
Esto marca un punto importante durante la actualización y es que el nombre sirve para tener una referencia a que parámetro estamos asignando el valor, pero para el provider de base de datos OleDb, lo que importa es la posición del parámetro en colección de Parameters.
Si en este código se declarar el parámetro “Id” en primer lugar la actualización no se realizaría 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 – Eliminación de la entidad (Delete)
Esta operación 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();
}
}
| [C#]
|
[VB.NET]
|