martes, 11 de agosto de 2009

Cargar los elementos de un Control DropDownList concatenando los valores de varios Campos de una Tabla de una Base de Datos SQL Server en ASP.Net

Para que en cada elemento de un Control DropDownList (combo) aparezcan concatenados los valores de distintos Campos de una Tabla definida previamente en una Base de datos SQL Server, será necesario realizar una doble Consulta sobre dicha Base de Datos.

Una primera Consulta para cargar el Control tomando como referencia el Campo establecido en la propiedad "DataTextField". Posteriormente, se recorrerán todos los elementos del Combo ejecutando una segunda Consulta para cada uno de estos elementos, de manera que podamos obtener la fila correspondiente y guardar sólo los valores de los campos que necesitamos.

Para ilustrar el ejemplo creamos una Clase Cliente:


   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Web;
   5:  using System.Data;
   6:  using System.Data.SqlClient;
   7:   
   8:  namespace BlogSalvatrosh
   9:  {
  10:      public class Cliente
  11:      {
  12:          public Cliente()
  13:          {
  14:          }
  15:   
  16:          private string campoCodigo = string.Empty;
  17:          private string campoNif = string.Empty;
  18:          private string campoNombre = string.Empty;
  19:   
  20:          public string Codigo
  21:          {
  22:              get { return campoCodigo; }
  23:              set { campoCodigo = value; }
  24:          }
  25:   
  26:          public string Nif
  27:          {
  28:              get { return campoNif; }
  29:              set { campoNif = value; }
  30:          }
  31:   
  32:          public string Nombre
  33:          {
  34:              get { return campoNombre; }
  35:              set { campoNombre = value; }
  36:          }
  37:   
  38:   
  39:          /// Ejecuta una consulta SQL (que recibe como parámetro) sobre la Base de Datos devolviendo el resultado de la consulta en un tipo "DataView"
  40:          public DataView CargarLista(string consulta)
  41:          {
  42:              SqlDataAdapter sqlDa = null;
  43:              DataTable dt = new DataTable();
  44:              SqlConnection conexion = new SqlConnection("CadenaDeConexion");
  45:              SqlCommand sqlCmd = new SqlCommand(consulta, conexion);   //Se crea un comando SQL con la consulta y el puente de conexión
  46:   
  47:              sqlDa = new SqlDataAdapter(sqlCmd);
  48:   
  49:              try
                   {
  50:                  conexion.Open();    //Se abre la conexión con la Base de Datos
  51:                  sqlDa.Fill(dt);   //Ejecuta la consulta y la adapta a un "DataTable" definido como "dt"
  52:                  return dt.DefaultView;  //Convierte la consulta en una vista (en un tipo "DataView")
  53:              }
  54:              catch (Exception)
  55:              {
  56:                  return null;
  57:              }
  58:              finally
  59:              {//Se cierra la conexión
  60:                  if (conexion.State == ConnectionState.Open)
  61:                      conexion.Close();
  62:              }
  63:          }
  64:   
  65:   
  66:          /// Construimos un Diccionario de datos con los campos y valores que necesitamos mostrar en el Combo
  67:          public Dictionary<string, string> CargarDiccionario(Dictionary<string, string> miDic)
  68:          {
  69:              //Supongamos que necesitamos guardar las propiedades "Nif" y "Nombre" del Objeto que estamos construyendo
  70:              miDic.Add("Nif", this.Nif);
  71:              miDic.Add("Nombre", this.Nombre);
  72:   
  73:              return miDic;
  74:          }
  75:      }
  76:  }


Y un Control de Usuario muy sencillo denominado "ComboCliente.ascx" que solo posee un Control DropDownList:


   1:  <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ComboCliente.ascx.cs" Inherits="BlogSalvatrosh.ComboCliente" %>
   2:  <asp:DropDownList ID="DropDownListClientes" runat="server"></asp:DropDownList>


En la Clase "ComboCliente.ascx.cs" asociada a este Control de Usuario insertamos el método que va cargando el Combo, al cual le podemos "llamar", para simplificar, desde el propio método Controlador del evento "Load()":


   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Web;
   5:  using System.Web.UI;
   6:  using System.Web.UI.WebControls;
   7:  using System.Data;
   8:   
   9:  namespace BlogSalvatrosh
  10:  {
  11:      public partial class ComboCliente : System.Web.UI.UserControl
  12:      {
  13:   
  14:          protected void Page_Load(object sender, EventArgs e)
  15:          {
  16:              CargarComboConcatenandoCampos();
  17:          }
  18:   
  19:          /// Carga el DropDownList (Combo) concatenando varios campos de alguna tabla de la Base de Datos
  20:          public void CargarComboConcatenandoCampos()
  21:          {
  22:              Cliente clt = new Cliente();
  23:   
  24:              DataView dv = (DataView)clt.CargarLista("Select * from NombreTabla");//Se llama al método "CargarLista(string)" de la Clase Cliente para que realice la consulta especificada
  25:   
  26:              if (dv != null)  //Siempre que la resultado de la consulta no sea null:
  27:              {
  28:                  this.DropDownListClientes.DataSource = dv;  //Se indica que debe tomar como origen de datos el DataView "dv"
  29:                  this.DropDownListClientes.DataTextField = "Codigo"; //Se indica que debe tomar como referencia de contenido el campo "Codigo"
  30:                  this.DropDownListClientes.DataValueField = "Codigo";    //Se indica que debe tomar como valor el valor del campo "Codigo"
  31:   
  32:                  try
  33:                  {
  34:                      this.DropDownListClientes.DataBind();  //Se realiza el enlace con el origen de datos
  35:                  }
  36:                  catch (ArgumentOutOfRangeException)
  37:                  {
  38:                  }
  39:              }
  40:   
  41:              //A continuación recorremos los elementos del Combo anteriormente cargados y le vamos concatenando el valor de otros campos correspondientes al mismo registro:
  42:              foreach (ListItem elemItem in DropDownListClientes.Items)
  43:              {
  44:                  clt.CargarLista("Select * from NombreTabla where Codigo = " + elemItem.Text);    //Volvemos a llamar al método que realiza la consulta sobre la Base de Datos obtieniendo la fila que corresponde con el valor del elemento del Combo actual
  45:                  Dictionary<string, string> camposYvalores = new Dictionary<string, string>();  //Creamos un diccionario de datos 
  46:                  camposYvalores = clt.CargarDiccionario(camposYvalores); //Llamamos al método que carga el Diccionario con los campos y valores que queremos mostrar en el Combo
  47:                  elemItem.Text = string.Empty;   //Vaciamos el elemento del combo
  48:   
  49:                  //Y a continuación volvemos a llenarlo con los valores del registro deseados:
  50:                  foreach (KeyValuePair<string, string> kvp in camposYvalores)
  51:                  {
  52:                      elemItem.Text += kvp.Value + " *** ";   //Al elemento del Combo se le concatena el valor del campo y tres asteriscos para separar los campos
  53:                  }
  54:   
  55:                  elemItem.Text = elemItem.Text.Remove(elemItem.Text.Length - 4, 4);  //Se eliminan los 4 últimos caracteres del elemento del combo (los asteriscos mas un espacio)
  56:              }
  57:          }
  58:      }
  59:  }

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:  }
Webs amigas:
Eduardo Soriano
Solcan
Taller de Joyería