Ver Mensaje Individual
  #2 (permalink)  
Antiguo 08/08/2007, 10:41
Avatar de zacktagnan
zacktagnan
 
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años, 1 mes
Puntos: 3
Re: SQLDataSource y SP

Hola a tod@s:

-- Trabajando en C# - ASP.NET 2.0 --

Justo este es el problema que estaba intentando averiguar como efectuarlo.

Yo también estaría interesado en saber como a través de pulsar un botón se puede ejecutar el SelectCommand de un SqlDataSource, el cuál viene dado por un Procedimiento almacenado de la Base de Datos.

Concretamente, mi caso es el siguiente:

Es una página que hace la función de login de usuario. Luego están los TextBox para un insertar el Nombre de Ususario y la Contraseña y el Botón de Entrar.

El SqlDataSource se encargará de realizar la consulta si los datos tecleados pertenecen a un ususario registrado. Si es así, se redirige al usuario a la página de inicio, sino se le advierte que no tiene permitido el acceso.

Anteriormente, había hecho todo programándolo por la parte de código .cs, usando un SqlCommand, e iniciando todo con el Click del botón

Este es el código con el SqlCommand:
Código:

    protected void btn_entrar_Click(object sender, EventArgs e)
    {
        //RECOGIENDO LOS DATOS DE ACCESO TECLEADOS
        usuUsu = usu_usu.Text;
        usuUsu = usuUsu.Replace("'", "''");
        usuPass = usu_pass.Text;
        usuPass = usuPass.Replace("'", "''");
        //VERIFICANDO DATOS
        verifDatosAcceso();

        if (verrorAcceso != "")
        {
            vinfoAcceso = "El ACCESO no se efectuó por falta de datos correctos:";
            vinfoAcceso = vinfoAcceso + "<p class='errores_acceso'>" + verrorAcceso + "</p>";
        }
        else
        {
            acceso_usuario();
        }
        //VACIANDO CAJA DE [Usuario] DEL FORMULARIO
        usu_usu.Text = "";
        //MOSTRANDO MENSAJE DE ACCESO FALLIDO Ó VÁLIDO
        panel_mens.Visible = true;
    }//fin btn_entrar_Click

    private void acceso_usuario()
    {
        SqlCommand coman_AccesoOK = new SqlCommand("SEL_usuId_perfilId_Acceso", conexion_ecogras);
        coman_AccesoOK.CommandType = CommandType.StoredProcedure;

        coman_AccesoOK.Parameters.Add(new SqlParameter("@usu_usu_prSel", SqlDbType.NVarChar)).Value = usuUsu.ToString();
        coman_AccesoOK.Parameters.Add(new SqlParameter("@usu_pass_prSel", SqlDbType.NVarChar)).Value = usuPass.ToString();
        coman_AccesoOK.Parameters.Add(new SqlParameter("@usu_id_prSel", SqlDbType.Int)).Direction = ParameterDirection.Output;
        coman_AccesoOK.Parameters.Add(new SqlParameter("@perfil_id_prSel", SqlDbType.TinyInt)).Direction = ParameterDirection.Output;
        coman_AccesoOK.Parameters.Add(new SqlParameter("@cuantosHay", SqlDbType.Int)).Direction = ParameterDirection.Output;
        int usu_valido = 0;

        try
        {
            conexion_ecogras.Open();
            coman_AccesoOK.ExecuteReader();
            usu_valido = (Int32)coman_AccesoOK.Parameters["@cuantosHay"].Value;
            //SI EL ACCESO ES DE UN USUARIO REGISTRADO
            if (usu_valido == 1)
            {
                btn_entrar.Enabled = false;
                btn_reset.Disabled = true;
                btn_salir.Enabled = true;

                Session["usu_id"] = coman_AccesoOK.Parameters["@usu_id_prSel"].Value;
                Session["perfil_id"] = coman_AccesoOK.Parameters["@perfil_id_prSel"].Value;

                //SI SE INTENTO ACCEDER ANTES DE LOGIN
                if (Request.QueryString["url_destino"] != null)
                {
                    //YENDO A PÁGINA REQUERIDA
                    Response.Redirect(Request.QueryString["url_destino"]);
                }
                else
                {
                    //YENDO A PÁGINA DE INICIO
                    Response.Redirect("home.aspx");
                }
            }
            else//SI NO ES UN USUARIO REGISTRADO
            {
                vinfoAcceso = "Solamente usuarios registrados/activos accederán al interior de este sitio web.";
                vinfoAcceso += "    <ul>\r";
                vinfoAcceso += "        <li>[ Registrarse ]</li>\r";
                vinfoAcceso += "    </ul>\r";
            }
            conexion_ecogras.Close();
        }
        catch (SqlException ex_AccesoAdmOK)
        {
            vinfoAcceso = "Se ha producido un error: " + ex_AccesoAdmOK;
        }
    }
Ahora lo que quiero conseguir es lo mismo, usando en vez del SqlCommand el SqlDataSource vinculado al mismo procedimiento SEL_usuId_perfilId_Acceso

Cuando he definido el SqlDataSource para esta página a través de la vista Diseño, con el asistente, poniéndole por nombre SqlDS_Login, he escogido el procedimiento y definido los parámetros quedando la parte html así:
Código HTML:
 <asp:SqlDataSource ID="SqlDS_Login" runat="server" ConnectionString="<%$ ConnectionStrings:ecogras_conexion %>"
            SelectCommand="SEL_usuId_perfilId_Acceso" SelectCommandType="StoredProcedure">
            <SelectParameters>
                <asp:FormParameter FormField="usu_usu" Name="usu_usu_prSel" Type="String" />
                <asp:FormParameter FormField="usu_pass" Name="usu_pass_prSel" Type="String" />
                <asp:Parameter Direction="Output" Name="usu_id_prSel" Type="Int32" />
                <asp:Parameter Direction="Output" Name="perfil_id_prSel" Type="Byte" />
                <asp:Parameter Direction="Output" Name="cuantosHay" Type="Int32" />
            </SelectParameters>
        </asp:SqlDataSource> 
El Procedimiento está construído así:
Código:
ALTER PROCEDURE [dbo].[SEL_usuId_perfilId_Acceso]
	@usu_usu_prSel NVARCHAR(200),
	@usu_pass_prSel NVARCHAR(200),
	@usu_id_prSel INT OUTPUT,
	@perfil_id_prSel TINYINT OUTPUT,

	@cuantosHay INT OUTPUT
AS
	SELECT @cuantosHay = COUNT(*)
	FROM
	USUARIOS INNER JOIN PERFILES
	ON
	USUARIOS.usu_perfil = PERFILES.perfil_id
	WHERE (usu_usu = @usu_usu_prSel) AND (usu_pass = @usu_pass_prSel)
	AND usu_activo = 1 AND perfil_activo = 1

IF @cuantosHay <= 0
	BEGIN
		PRINT '* NINGÚN USUARIO ENCONTRADO *'
		RETURN (0)
	END
ELSE
	BEGIN
		SELECT @usu_id_prSel = usu_id,  @perfil_id_prSel = perfil_id
		FROM USUARIOS INNER JOIN PERFILES
		ON
		USUARIOS.usu_perfil = PERFILES.perfil_id
		WHERE (usu_usu = @usu_usu_prSel) AND (usu_pass = @usu_pass_prSel)
	
		PRINT '* El USUARIO ESTÁ REGISTRADO *'
		PRINT @usu_id_prSel
		PRINT @perfil_id_prSel
		RETURN (1)
	END
Entonces, la cosa es la misma a realizar: si el parámetro de salida @cuantosHay es mayor de 0 es que los datos pertenecerán a un usuario registrado y entonces se le dará paso de la misma forma que antes se ha indicado.

Luego, ¿cómo ejecutar el Select del SqlDataSource para que se origine todo esto?

Gracias a todo el que aporte algo...
__________________
Saludos,

zacktagnan.
=================================================