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...