lunes, 3 de agosto de 2009

Comprobar los valores nulos de cada Campo tras realizar una consulta a una Base de datos SQL Server con Visual C#.

Para comprobar los posibles valores nulos de los Campos de una Tabla obtenidos como resultado de una Consulta lanzada sobre una base de datos SQL Server, de manera que podamos analizar los valores antes de trabajar con ellos, guardaremos el resultado de la Consulta en un Objeto "DataView" y, posteriormente, realizaremos una simple comparación, Campo a Campo (utilizando la propiedad "Value" de la Clase "DBNull": DBNull.Value) de la fila ó filas obtenidas (en nuestro caso, una sola fila: Table.Rows[0]).

La consulta sobre la Base de datos SQL Server se ejecuta utilizando el método "Fill(DataTable)" de la Clase "SqlDataAdapter" (una Clase adaptadora) y, posteriormente, se almacena el resultado de la consulta en un objeto "DataView".

Para ilustrar fácilmente el ejemplo he utilizado una Clase Cliente (en la que inserto todo el código para facilitar la comprensión, aunque debería dividirse en distintas Clases y Capas) y una consulta SQL incrustada en el código (que tampoco es muy ortodoxo) para simplificarlo.

Veamos el código:


   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:  using System.Data;
   6:  using System.Collections;
   7:  using System.Data.SqlClient;
   8:  using System.ComponentModel;
   9:   
  10:  namespace BlogSalvatrosh
  11:  {
  12:      public class Cliente
  13:      {
  14:          public Cliente()
  15:          {
  16:          }
  17:   
  18:          private string campoCodigo = string.Empty;
  19:          private string campoNif = string.Empty;
  20:          private string campoNombre = string.Empty;
  21:   
  22:          public string Codigo
  23:          {
  24:              get{return campoCodigo;}
  25:              set{campoCodigo = value;}
  26:          }
  27:   
  28:          public string Nif
  29:          {
  30:              get{return campoNif;}
  31:              set{campoNif = value;}
  32:          }
  33:   
  34:          public string Nombre
  35:          {
  36:              get{return campoNombre;}
  37:              set{campoNombre = value;}
  38:          }
  39:   
  40:   
  41:          /// Tras hacer una llamada al método que ejecuta la consulta sobre la Base de Datos, llama al método que crea un objeto Cliente asignando los valores obtenidos en la consulta a sus propiedades públicas, comprobando previamente los valores nulos de cada campo.
  42:          public Cliente ControlarValoresNulos()
  43:          {
  44:              string consulta = string.Empty;
  45:              Cliente cl = new Cliente();
  46:   
  47:              consulta = "SELECT * FROM NombreTabla WHERE codigo = '56'";   //Insertamos aquí una consulta para ilustrar el ejemplo
  48:   
  49:              //Se llama al método que realiza la Consulta sobre la Base de Datos pasándole como parámetro la consulta indicada anteriormente:
  50:              DataView vista = (DataView)CargarLista(consulta);
  51:   
  52:              if (vista.Count != 0)   //Si la consulta devuelve alguna fila
  53:                  cl = CrearObjetoCliente(vista.Table.Rows[0]); //Llamamos al método que asigna los valores obtenidos en la consulta a las propiedades del objeto Cliente
  54:   
  55:              return cl;  //Retornará el objeto creado
  56:          }
  57:   
  58:   
  59:          /// Este método creará un objeto Cliente a cuyas propiedades se le asignarán los valores de cada uno de los campos obtenidos en el "DataRow" que recibe como parámetro, comprobando si los valores de cada campo son valores null
  60:          private Cliente CrearObjetoCliente(DataRow dr)
  61:          {
  62:              if (dr["codigo"] != DBNull.Value)    //Si el campo "codigo" no es nulo
  63:                  this.Codigo = dr["codigo"].ToString();//Se le asigna su valor a la propiedad "Codigo" del objeto que estamos construyendo
  64:              else
  65:                  this.Codigo = string.Empty;//En caso contrario le asignamos una cadena vacía
  66:   
  67:              //Y repetimos la operación para el resto de los campos:
  68:              if (dr["NIF"] != DBNull.Value)
  69:                  this.Nif = dr["NIF"].ToString();
  70:              else
  71:                  this.Nif = string.Empty;
  72:   
  73:              if (dr["nombre"] != DBNull.Value)
  74:                  this.Nombre = dr["nombre"].ToString();
  75:              else
  76:                  this.Nombre = string.Empty;
  77:              
  78:              return this;    //Devuelve el objeto que estamos construyendo
  79:          }
  80:   
  81:   
  82:          /// Ejecuta una consulta SQL (que recibe como parámetro) sobre la Base de Datos devolviendo el resultado de la consulta en un tipo "DataView"
  83:          public static DataView CargarLista(string consulta)
  84:          {
  85:              SqlDataAdapter sqlDa = null;
  86:              DataTable dt = new DataTable();
  87:              SqlConnection conexion = new SqlConnection("CadenaDeConexion");
  88:              SqlCommand sqlCmd = new SqlCommand(consulta, conexion);   //Se crea un comando SQL con la consulta y el puente de conexión
  89:   
  90:              sqlDa = new SqlDataAdapter(sqlCmd);
  91:   
  92:              try
                   {
  93:                  conexion.Open();    //Se abre la conexión con la Base de Datos            
  94:                  sqlDa.Fill(dt);   //Ejecuta la consulta y la adapta a un "DataTable" definido como "dt"
  95:                  return dt.DefaultView;  //COnvierte la consulta en una vista (en un tipo "DataView")
  96:              }
  97:              catch (Exception)
  98:              {
  99:                  return null;
 100:              }
 101:              finally
 102:              {//Se cierra la conexión
 103:                  if (conexion.State == ConnectionState.Open)
 104:                      conexion.Close();
 105:              }
 106:          }
 107:      }
 108:  }

2 comentarios:

  1. pucha te pasastes ta chevere, pro una pregunta como podrias hacer para separar:

    public Cliente ControlarValoresNulos()
    private Cliente CrearObjetoCliente(DataRow dr)
    pubic static DataView CargarLista(string Consulta)

    en una biblioteca de clases aparte??

    osea como si estuvieras trabajando con capas y las clases que te mensiono pasaran a formar parte de una biblioteca de clases aparte, ojala hayas tenido este tipo de trabajos en tu gran experiencia sino me avisas pa enviarte algunita por alli algun ejemplo que tengo desarrollando y se encuentran en pausa por las validaciones de datos nulos, aunque se por un pata de un foro... q te escribio, no se si la solucion q muestras sera lo que el queria pero bueno seguire investigando haber si encuentro algo por alli de la validacion de valores nulos en C# trabajando con capas, ojala nos puedas ayudar o hechar una manito, cualquier cosa me pasas la voz a este correo rigaldan@gmail.com

    ResponderEliminar
  2. Bueno, sobre "Patrones de Diseño de Aplicaciones" se ha escrito mucho y hay opiniones y tendencias para todos los gustos.

    Por supuesto, cada uno es libre de diseñar su Aplicación como mejor le parezca. Pero, en mi opinión, debería intentarse simplificar en lo posible tanto la implementación del código como el diseño de las capas buscando siempre la eficiencia y, sobre todo, pensando en facilitar al máximo el mantenimiento futuro de la Aplicación.

    Dicho esto, y remitiéndome al ejemplo en cuestión, suponiendo que hayamos dividido la Aplicación en las tres Capas fundamentales, tendríamos:

    1º La Capa de Presentación, como Proyecto Principal, en el que se albergaría la interfaz de Usuario. A ella se "agregaría", en una Biblioteca de Clases:
    2º La Capa de Negocio, que albergaría todas las Clases basadas en las Entidades de las Tablas de la Base de Datos con la que vamos a interactuar. En nuestro caso aquí se implementaría la Clase "Cliente" y, dentro de esta Clase, además de establecer tantas propiedades como campos tenga la Tabla a la que hace referencia, se podrían incluir los métodos:

    public Cliente ControlarValoresNulos();
    private Cliente CrearObjetoCliente(DataRow dr);

    A esta Capa se "agregaría", también en una Biblioteca de Clases (además de las subcapas necesarias para implementar toda la lógica de negocio):

    3º La Capa de Datos, en donde implementaría una Clase que ejecutara todas las acciones directas sobre la Base de Datos (métodos insertar, modificar, etc.). En esta Clase se incluiría nuestro método:

    pubic static DataView CargarLista(string Consulta);

    Espero haber contestado tu pregunta. Saludos.

    ResponderEliminar

Webs amigas:
Eduardo Soriano
Solcan
Taller de Joyería