Como usar stored procedure en C#

Posted on 14 of julio, 2015 by admin in C# & VB.net

Tabla de contenido:

  1. Introducción
  2. Creación de conexión a database
  3. Creación de dal
  4. Creación clases

 

  1. Introducción

Actualmente en la vida diaria de un desarrollador nos vemos en la necesidad de utilizar stored procedure ya creados por el equipo de dba o  creados por nosotros mismo en este post trataremos de ver cómo podemos usar Data Access Object (Dao)  para la utilización de stored procedure.

Primero crearemos una app Windows o Web para la implementación y uso de los stored procedure.

  1. Creación de conexión a database

Agregamos al proyecto una clase que llamaremos ConnectionString y agregamos la referencia de System.Configuration para poder utilizar la clase ConfiguractionManager.

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace com.jprograming
{

  public class ConnectionString
  {

     public static String ConnectionStrings
     {
        get
        {
           return System.Configuration.ConfigurationManager.ConnectionStrings["connection"].ConnectionString;
        }
    }
  }
}

Esta clase que creamos se encargara de manipular la cadena de conexión que tenemos en el app.config o web.config dependiendo del tipo de proyecto seleccionado. Ahora creamos una interface llamada IConnection:IDisposable y implementamos la interface IDisposable  luego creamos la clase llamada Connection:IConnectionQue implemente la interface IConnection  que se encargara de abrir y cerrar la conexión de la base de datos veamos el código a continuación.  Interface:

 

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;

namespace com.jprograming
{
 public interface IConnection : IDisposable
 {
    SqlConnection Open();
    SqlConnection Get();
    void Close();
 }
}
 

 

Class:

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;

namespace com.jprograming
{
  public class Connection:IConnection
  {
     private SqlConnection _Connection;
     //
     public Connection() {
         _Connection = new SqlConnection(ConnectionString.ConnectionStrings);
     }
    //
    public System.Data.SqlClient.SqlConnection Open()
    {
       if (_Connection.State != System.Data.ConnectionState.Open)
       {
         _Connection.Open();
       }
       return _Connection;
    }
   //
   public System.Data.SqlClient.SqlConnection Get()
   {
      return _Connection;
   }
   //
  public void Close()
  {
     if (_Connection.State == System.Data.ConnectionState.Open)
     {
       _Connection.Close();
     }
  }
  //
  public void Dispose()
  {
         Close();
         GC.SuppressFinalize(this);
  }

 }
}


 

Ahora crearemos una la interface dao de la cual utilizaremos para implementar los objectos dao la interface llamada IDao<T>:IDisposable esta interface también implementa IDisposable.

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;

namespace com.jprograming
{
    public interface IDao<T>:IDisposable
    where T : class, new()
    {
          T Insert(T model);
          void Update(T model);
          bool Remove(T model);
          List<T> All();
          T FindOrDefault(params Object[] keys);
          T BuilderEntity(SqlDataReader dr);
   }
}


Ahora continuamos con la implementación de la clase que utilizaremos para serializar la data traída de la base de datos esta clase la llamaremos EN_CONTACT_STATUS.
Esta tabla fue tomada de ejemplo de las tablas que utilizo en el trabajo en caso de que alguien quiera implementar este ejemplo descargar el ejemplo del link descarga con todos los datos requeridos.

 

Class:

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace com.jprograming
{
    [Serializable]
    public partial class EN_CONTACT_STATUS
    {
          #region property
           public Int32 Status_Id {get;set;}
           public String Status_Desc {get;set;}
           public DateTime Create_Date {get;set;}
           public DateTime? Modi_Date {get;set;}
           public Int32 Create_UsrId {get;set;}
           public Int32? Modi_UsrId {get;set;}
           public String Hostname {get;set;}
          #endregion
    }
}


 

Class Dao:

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using com.jprograming;

namespace com.jprograming
{
      public class EN_CONTACT_STATUSDao : IDao<EN_CONTACT_STATUS>
      {
            private IConnection _Connection = null;
           //
           public EN_CONTACT_STATUSDao()
           {
               _Connection = new Connection();
               _Connection.Open();
           }
          //
          public EN_CONTACT_STATUS Insert(EN_CONTACT_STATUS model)
          {
              return model;
          }
          //
          public void Update(EN_CONTACT_STATUS model)
          {
               throw new NotImplementedException();
          }
          //
         public EN_CONTACT_STATUS FindOrDefault(params object[] keys)
         {
            EN_CONTACT_STATUS oEN_CONTACT_STATUS = null;
           using (SqlCommand Command = _Connection.Get().CreateCommand())
           {
              Command.Connection = _Connection.Get();
              Command.CommandText = "dbo.udfGetEN_CONTACT_STATUS";
              Command.CommandType = System.Data.CommandType.StoredProcedure;
              Command.Parameters.Add("Status_Id", System.Data.SqlDbType.Int).Value = keys[0];
              using (SqlDataReader Reader = Command.ExecuteReader())
             {
                 if (Reader.HasRows)
                 {
                      while (Reader.Read())
                     {
                         oEN_CONTACT_STATUS = BuilderEntity(Reader);
                     }
                 }
            }
         }
           return oEN_CONTACT_STATUS;
       }
      //
      bool IDao<EN_CONTACT_STATUS>.Remove(EN_CONTACT_STATUS model)
      {
         throw new NotImplementedException();
      }

     public List<EN_CONTACT_STATUS> All()
     {
         throw new NotImplementedException();
     }

    public EN_CONTACT_STATUS BuilderEntity(SqlDataReader Reader)
    {

        EN_CONTACT_STATUS oEN_CONTACT_STATUS = new EN_CONTACT_STATUS();
        if(!Reader.IsDBNull(0)){ oEN_CONTACT_STATUS.Status_Id = Reader.GetInt32(0);}
        if(!Reader.IsDBNull(1)){ oEN_CONTACT_STATUS.Status_Desc = Reader.GetString(1);}
        if(!Reader.IsDBNull(2)){ oEN_CONTACT_STATUS.Create_Date = Reader.GetDateTime(2);}
        if(!Reader.IsDBNull(3)){ oEN_CONTACT_STATUS.Modi_Date = Reader.GetDateTime(3);}
        if(!Reader.IsDBNull(4)){ oEN_CONTACT_STATUS.Create_UsrId = Reader.GetInt32(4);}
        if(!Reader.IsDBNull(5)){ oEN_CONTACT_STATUS.Modi_UsrId = Reader.GetInt32(5);}
        if(!Reader.IsDBNull(6)){ oEN_CONTACT_STATUS.Hostname = Reader.GetString(6);}
        return oEN_CONTACT_STATUS;
   }

   public void Dispose()
   {
         _Connection.Close();
         GC.SuppressFinalize(this);
    }

  }
}

 

Para finalizar eh creado un window form con un datagridview llamado dgResult:

 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace com.jprograming
{
     public partial class Ejemplo01 : Form
     {
         private EN_CONTACT_STATUSDao dao = null;
         public Ejemplo01()
         {
           InitializeComponent();
         }
         private void Ejemplo01_Load(object sender, EventArgs e)
         {
              dao = new EN_CONTACT_STATUSDao();
              List<EN_CONTACT_STATUS> oList= new List<EN_CONTACT_STATUS>();
              oList.Add(dao.FindOrDefault(new Object[] { 1 }));
              this.dgResult.DataSource = oList;
         }
     }
}


En si tienes dudas de cómo implementar esto dejar un comentario o puedes descargar los código fuente del ejemplo o ver como se realizó en el canal de YouTube.