Forums Últimos mensajes - Powered by IBM
 

Recuperar Datos de un Procedimiento

26/02/2009 - 18:26 por RP | Informe spam
Hola que tal, bueno estoy haciendo mis pininos en programar C# con
Procedimientos Almacenados, e hice un procedimiento para validar mi Login,
que es el Siguiente:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[sp_ValidarLogin]
@chrLogin char(8),
@nvcPassword nvarchar(25)
AS
DECLARE
@intCodigo int,
@intEstado int,
@nvcTPassword nvarchar(25)
BEGIN
If Exists
(Select Codigo
From Usuario
Where [Login]=@chrLogin And [Estado]=1)
BEGIN
Select @intCodigo=Codigo, @nvcTPassword=Password, @intEstado=Estado
From Usuario Where [Login]=@chrLogin

IF (Select
pwdCompare(@nvcPassword,@nvcTPassword) From Usuario Where
Codigo=@intCodigo)=1
BEGIN
RETURN 1 --Contraseña Correcta
SET NOCOUNT ON
Select Codigo, Nombre, [Login], Tipo
From Usuario Where
Codigo=@intCodigo
END
ELSE
BEGIN
RETURN 3 --Contraseña Incorrecta
END
END
ELSE
BEGIN
RETURN 0 --Si el Usuario no Existe
END
END

Al Ejecutar el Procedimiento me devuelve 1 si es Correcto, 3 Si es
Contraseña Incorrecta, y 0 si el usuario no Existe, mi pregunta es la
siguiente, como hago para obtener esos resultados en mi clase de login del C#
para comparar y mandar los mensajes pertinentes, y aceptar pasar al
formulario MDI, aparte como obtener los datos que salen en el Select cuando
RETURN 1,
Espero que me puedan ayudar y/u orientar, Gracias de Antemano
 

Leer las respuestas

#1 Alberto Poblacion
27/02/2009 - 22:38 | Informe spam
"RP" wrote in message
news:
ALTER PROCEDURE [dbo].[sp_ValidarLogin]
@chrLogin char(8),
@nvcPassword nvarchar(25)
AS
[...]
RETURN 1 --Contraseña Correcta
[...]
Select Codigo, Nombre, [Login], Tipo
[...]
como hago para obtener esos resultados en mi clase de login del C#
para comparar y mandar los mensajes pertinentes, y aceptar pasar al
formulario MDI, aparte como obtener los datos que salen en el Select
cuando
RETURN 1,



El valor de retorno, desde el punto de vista del código cliente, se
considera un parámetro más, del tipo "ReturnValue". Por lo tanto, la llamada
al procedimiento se hace parametrizndo el command y leyendo el valor del
parámetro al terminar la ejecución:

SqlConnection cn = new SqlConnection(cadena);
SqlCommand cmd = new SqlCommand("[dbo].[sp_ValidarLogin]", cn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@chrLogin", SqlDbType.Char, 8).Value = txtLogin.Text;
cmd.Parameters.Add("@nvcPassword ", SqlDbType.NVarChar, 25).Value =
txtPwd.Text;
SqlParameter ret = new SqlParameter("@Return_Value", SqlDbType.Int);
ret.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(ret);
cn.Open();
SqlDataReader rdr = cmd.ExecuteReader()
{
while (rdr.Read())
{
Procesar registro
}
}
rdr.Close();
int ValorDevuelto = ret.Value;
cn.Close();

Atención a las tres últimas líneas: Tienen que ir precisamente en esta
secuencia, es decir, hay que cerrar el DataReader que está leyendo los
registros de la Select ANTES de que se pueda leer el valor del parámetro de
retorno, y esto a su vez tiene que hacerse antes de cerrar la conexión.
Ya sé que sólo querías leer los registros de la Select si el valor de
retorno es 1, pero me temo que el comportamiento predeterminado de ado.net
requiere que primero leas los registros antes de saber el valor del retorno
(símplemente, no llegará ninguno y el bucle while se lo saltará sin hacer
nada).

Preguntas similares