jueves, 28 de junio de 2012

Ejecutar procedimientos almacenados desde C#


Un procedimiento almacenado (store procedure) no es más que un conjunto de instrucciones T-SQL que se ejecutan de forma ordenada en el Servidor de bases de datos pudiendo este recibir o devolver parámetros al usuario.
Entre las principales ventajas de utilizar sp  podemos mencionar las siguientes:
Seguridad: Le otorgamos permisos a los usuarios de ejecutar determinado sp y no a los objetos de la Base de datos.
Mejor Rendimiento: Al invocar un sp este se compila en el motor de base de datos y esta versión compilada será utilizada hasta que el servicio SQL se reinicie. Las instrucciones que mandamos en cadena desde nuestra aplicación son ejecutadas cada vez que se manda al motor de base de datos.

Bueno vamos a lo que nos interesa. Al código J

Diremos que tenemos una tabla llamada PERSONA  y esta contiene los siguientes campos:
Idpersona --> Numerico y se  incrementa de uno en uno automáticamente.
nombre -->  String  nvarchar(50)
apellido -->  String  nvarchar(50)

Vamos a crear el sp que inserte un nuevo registro:

CREATE PROCEDURE sp_insert_tabla  @nombre nvarchar(50),
                                 @apellido nvarchar(50),
                                  @msg as nvarchar(100) output
AS
BEGIN
 SET NOCOUNT ON;
 BEGIN TRAN TADD
 BEGIN TRY
  INSERT INTO PERSONA (nombre,apellido) VALUES (@nombre,@ apellido)   
  COMMIT TRAN TADD
 END TRY
 BEGIN CATCH
      SET @msg = 'OCURRIO UN ERRO: ' + ERROR_MESSAGE() + 'EN LA LINEA ' + CONVERT(NVARCHAR(255),ERROR_LINE()) + '.'
      ROLLBACK TRAN TADD
 END CATCH
END
GO

Datos a tener en cuenta en el procedimiento almacenado:
SET NOCOUNT ON --Muestra el recuento de No. de filas afectadas
BEGIN TRAN TADD -- Marca el inicio de la transacción. Incrementa el @@TRANCOUNT en 1
COMMIT TRAN TADD --Marca el final de la transacción correcta si @@TRANCOUNT=1 hace que todos cambios efectuados en los datos desde el inicio de la transacción sean parte permanente de la base de dato.
ROLLBACK TRAN TADD--Revierte una transacción hasta el inicio se puede decir que borra toda las modificaciones de los datos realizada desde el inicio de la transacción.Tambien libera recursos que mantenia la transacción.

Una vez que tenemos el procedimiento almacenado vamos a invocarlo desde nuestra aplicación con C# y creamos una función para esto:

/*Función que ejecuta sp de inserción, aqui utilizamos una cadena de conexion que esta declara en el web.config*/
protected void ejecutar_sp_insert(string wnombre, string wapellido)
{
    string error = "";
    SqlConnection conexion = new SqlConnection();
    conexion.ConnectionString =         ConfigurationManager.ConnectionStrings["TESTINGConnectionString"].ConnectionString;
    SqlCommand cmd = new SqlCommand("sp_insert_tabla", conexion);
    cmd.CommandType = CommandType.StoredProcedure;       
    cmd.Parameters.Add("@nombre",SqlDbType.NVarChar,50).Value = wnombre;
    cmd.Parameters.Add("@apellido",SqlDbType.NVarChar,50).Value = wapellido;
    cmd.Parameters.Add("@msg", SqlDbType.NVarChar,100);
    cmd.Parameters["@msg"].Direction = ParameterDirection.Output;
    try
    {
         conexion.Open();
         cmd.ExecuteNonQuery();
         conexion.Close();
    }
    catch(System.Exception  ex)
    {
         error = "Error: " + ex.Message;
    }
}
En esta función lo mas relevante es los siguiente:
Al SqlCommand le pasamos el nombre del sp sp_insert_tabla mas la conexión.
Tambien agregamos los parametros de entrada del sp en este caso es nombre y apellido. Se le espcifica que el parametro msg es una variable de salida. Abrimos la conexión, ejecutamos, cerramos la conexión todo esto en try/catch para manipular un eventual error.

Y listo asi de simple es ejecutar un sp desde c#.



lunes, 4 de junio de 2012

Utilizar conexión del web.config desde cualquier parte de proyecto

Aquí veremos cómo utilizar la cadena de conexión que tenemos en el archivo web.config para no escribirla en las demás paginas del sitio cada vez que queramos realizar un CRUD a la base de datos.
C=CREATE
R=READ
U=UPDATE
D=DELETE
Muy bien entonces vamos al archivo web.config para agregar la cadena de conexión:
<configuration>
<connectionStrings>
<add name="Nombre" connectionString="Data Source=Server;Initial Catalog=BD; User ID=user;Password=passw" providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
Con esto ya agregamos la conexión en el web.config, datos a tener en cuenta :
Name: nombre de la conexión, muy importante ya que en una aplicación podemos tener más de una conexión sin importar el Motor de Base de Datos. Con este nombre haremos referencia a dicha conexión.
connectionString: no es más que la cadena de conexión en donde especificamos el Servidor, Base de Datos, Usuario, Contraseña.
providerName: Obtiene o establece el nombre del proveedor de datos de .NET Framework que utiliza el control SqlDataSource para conectar a un origen de datos subyacente.
Ahora lo que nos interesa ¿Cómo utilizar esta conexión en otras páginas de mi sitio Web?
Fácil y sencillo:
1.) Importamos los Namespace:
System.Configuration
System.Data
System.Data.SqlClient
2.) Declaramos una variable de tipo SqlConnection a la que le asignaremos la cadena de conexión
SqlConnection conexion = new SqlConnection();
conexion.ConnectionString = ConfigurationManager.ConnectionStrings["NOMBRECONEXION"].ConnectionString;
y eso sería todo.
Espero que les ayude un poco

Autenticación basada en Formularios para la Web

La autenticación o autentificación (los dos términos son validos) basada en formulario es muy importante cuando queremos que el contenido de nuestro directorio este en una sección privada y que su acceso sea mediante validación de usuario.
Para implementar este tipo de autenticación debemos modificar el archivo web.config en donde negaremos la entrada a usuarios anónimos.
 En la realización de este ejemplo supondremos que tenemos dos formularios web, uno donde los usuarios se autenticaran, y otro que los usuarios verán después de haber validado su usuario y contraseña. Al primero llamaremos inicio.aspx y al segundo menú.aspx
Ya con esto podemos iniciar:
Nuestra atención debe estar en la parte de <authentication></authentication> en donde diremos el modo de autentificación.(En el archivo web.config que estamos editando)

<configuration>
   <system.web>
     <authentication mode="Forms">
        <forms defaultUrl="menu.aspx" loginUrl="inicio.aspx" name=".aspAuth">
        </forms>
      </authentication>
    </system.web>
<configuration>
Muy bien como notamos la autenticación es en modo formulario por esto mode=”Forms”, lo siguiente es decir cuál es el formulario para hacer login y cuál es el formulario principal que verán los usuario después de validarse esto lo hacemos en defaultUrl y loginUrl. En defaultUrl fijamos el formulario que los usuarios verán después de validarse y en loginUrl el formulario donde el usuario hará login.
Este modo de autentificación utiliza la cookies del navegador para establecer la identidad del usuario, en name=".aspAuth" asignamos el nombre de la cookie que guardara los datos de la autenticación, si no le damos un nombre se asignará por defecto .aspAuth, en el caso de tener más de una aplicación en nuestro servidor web, lo mejor sería asignar un nombre diferente para cada aplicación.
Lo siguiente sería negar la entrada a usuarios anónimos:
<configuration>
    <system.web>
        <authentication mode="Forms">
          <forms defaultUrl="menu.aspx" loginUrl="inicio.aspx" name=".aspAuth">
          </forms>
        </authentication>
        <authorization>
             <deny users="?"/>
         </authorization>
      </system.web>
<configuration>
? = todo los usuarios anonimos
*= todos los usuarios no importa si es anónimo o autenticado
Con esto tenemos ya todo preparado para decirle a la aplicación mediante código C# como autenticar a los usuarios:
Lo primero seria ver si el usuario existe en la base de datos, aquí le mostraremos un ejemplo sencillo para hacer esto con la idea de mostrar la lógica de este método de autenticación, pero en la realidad lo más prudente es cifrar la contraseña y validar los datos de entrada.
Importamos los Namespace:
System.Data
System.Data.SqlClient
System.Security

Public bool Entrar(string usuario,string passwd)
{
   SqlConnection conexion = new SqlConnection();
   conexion.ConnectionString = "Data Source=Servidor;Initial Catalog=DB; User Id=user;   Password=passs;";
    string consulta = "SELECT * FROM TbUsuario WHERE Usuario=@Usuario AND Passwd=@Passwd";
    SqlCommand cmd_user = new SqlCommand(mi_selec, conexion);
    cmd_user.Parameters.Add("Usuario", SqlDbType.Char).Value = txtUsuario.Text.Trim();
    cmd_user.Parameters.Add("Passwd", SqlDbType.Char).Value = txtPasswd.Text.Trim();
     DataTable dt_user = new DataTable();
     SqlDataAdapter da_user = new SqlDataAdapter();
     da_user.SelectCommand = cmd_user;

     try
     {
         da_user.Fill(dt_user);
         return (dt_user.Rows.Count == 1);
     }
     catch (Exception ex)
     {
         label.Text = "Error: " + ex.Message;
     }
}
Ahora cuando el usuario de click en el boton validarse utilizamos esta función que creamos con el nombre Entrar() esta nos regresará true si el usuario existe o false sino existe.
protected void btnlogin_Click(object sender, EventArgs e)
{
     If(Entrar(txtusuario.Text,txtpasswd.Text)==true)
     {
          //si existe lo mandamo al menu.aspx
          FormsAuthentication.RedirectFromLoginPage(txtUsuario.Text.Trim(),false);
      }
     Else
     {
          // el usuario no existe
          Label.Text = “Usuario o contraseña incorreta”;
     }
}
Listo asi de sencillo si el usario existe llamamo al método RedirectFromLoginPage de la clase FormsAuthentication que nos direcciona a la pagina del menú. Como vemos este método recibe dos parámetros el nombre del usuario y si se va a crear una cookie persistente para que recuerde el nombre del usuario en el próximo ingreso al sitio.
Tambien en la clase FormsAuthentication encontramos dos métodos muy utiles:
FormsAuthentication.SingOut() = Termina la sesión.
FormsAuthentication.RedirectToLoginPage() = Me manda a la pagina del login.
Estos dos mentos los puedes utilizar en un botón Terminar Session.
Espero que esto haya sido de tu ayuda.