2011-04-14 4 views
4

데이터베이스에서 일부 정보를 검색하고 반환 값을 검색하려고했습니다. 저장 프로 시저가 올바르게 작동하는 것을 알고 있습니다.출력이 포함 된 저장 프로 시저 호출

내가 사용하는 코드는 사용자 등록에 사용되는 수정 된 부분입니다. 내 코드의 cmd.ExecuteReader 부분에서 잘못되었습니다. 난 그냥 단순히 cmd.ExecuteScalar();를 사용하여 반환 값을 수신 할 때

protected void btn_login_Click(object sender, ImageClickEventArgs e) 
{ 
    //Actions after Submit button is clicked 
    Page.Validate(((ImageButton)sender).ValidationGroup); 

    if (Page.IsValid) 
    { 
     using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DbConnectString"].ConnectionString)) 
     { 
      SqlCommand cmd = new SqlCommand("usp_validateUsers", conn); 
      //Input Values 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.AddWithValue("username", Uname.Text); 
      cmd.Parameters.AddWithValue("password", pwd.Text); 
      //Return Values 
      SqlParameter retParam = cmd.Parameters.Add("@RetVal", SqlDbType.Int); 
      retParam.Direction = ParameterDirection.ReturnValue; 
      SqlParameter acsParam = cmd.Parameters.Add("@ac_status", SqlDbType.Int); 
      acsParam.Direction = ParameterDirection.Output; 
      SqlParameter nikParam = cmd.Parameters.Add("@memb_name", SqlDbType.VarChar); 
      nikParam.Direction = ParameterDirection.Output; 

      try 
      { 
       // Open Connection and execute Stored Proc 
       conn.Open(); 
       ///////////SOMETHING GOES WRONG HERE/////////////// 
       cmd.ExecuteReader(); 

       //Retrieve Data 
       int retVal = (int)retParam.Value; 
       string nickname = nikParam.Value.ToString(); 
       string ac_stats = acsParam.Value.ToString(); 

       if (retVal != 0) 
       { 
        //Invalid Username or password 
       } 
       else 
       { 
        //Login User 
       } 
      } 

      catch (Exception Error) 
      { 
       lbl_login.Text = "An error occured, please try again later"; 
       debug.Text = Error.Message; 
      } 

      finally 
      { 
       debug.Text = "\n Clossing Connection"; 
       if (conn.State == System.Data.ConnectionState.Open) 
       { 
        conn.Close(); 
       } 

      } 
     } 
    } 
} 

나는 내가 SQL 데이터베이스에 SQL 쿼리를 전달있을 때 데이터를 수신하는 방법을 알고 있지만, 저장 프로 시저를 사용하는 경우 다른 것 같다.

수정 아마이 코드를 더 향상시킬 수는 있지만 실제로해야 할 일을 수행합니다.

ALTER PROCEDURE dbo.usp_validateUsers 

@username varchar(10), 
@password varchar(10), 
@ac_status char(1) OUTPUT, 
@memb_name varchar(15) OUTPUT 

AS 
IF EXISTS(SELECT * FROM MEMB_INFO WHERE (memb___id = @username)) 
BEGIN 
    SELECT @ac_status = ac_status, @memb_name = memb_name 
    FROM MEMB_INFO 
    WHERE (memb___id = @username) AND (memb__pwd = @password) 
    RETURN 0 
END 

ELSE 
BEGIN 
    return 1 
END 

나는 Visual Studio에서 가능한 예외를 잡기 위해 브레이크 포인트를 사용, 그것은 저를 제공합니다 문자열 [4] : 크기 속성은 당신은 SqlDataReader 개체를 만들 필요가 0

+0

:

SqlParameter nikParam = cmd.Parameters.Add("@memb_name", SqlDbType.VarChar); 

이 시도 대신 같은 라인을 가지는? – Jacob

+0

문자열 [4]의 크기가 0입니다. – Raskaroth

+1

문자열 매개 변수에 길이가 있어야합니다. –

답변

6

언급 한 오류는 사용자가 VarChar 매개 변수의 크기를 지정하지 않아서 발생할 수 있습니다. 당신이 얻을 오류가`ExecuteReader`을 실행중인 때 어떤

SqlParameter nikParam = cmd.Parameters.Add("@memb_name", SqlDbType.VarChar, 15); 
+0

도움 주셔서 감사합니다. :) 그 바보 같은 실수를 직접 보았 으면 좋겠다. – Raskaroth

0

의 잘못된 크기를 갖는다.

Ins and Outs of using Stored Procedures in C#에서 SqlDataReader 개체 클래스는 에 사용되는 데이터베이스에서 반환 된 레코드 의 앞으로 만 이동 가능한 스트림을 읽습니다. SqlDataReader 개체 개체는 생성자 (새 키워드의 따라서 부족) 오히려 SqlCommand를 개체의 ExecuteReader 메서드를 통해 통해 인스턴스를 직접 없습니다. ExecuteReader 메서드를 호출하기 전에 에 대한 연결은 데이터베이스가 Open 메서드 인 SqlConnection 개체를 사용하여 설정됩니다.

시도

SqlDataReader drLogins; 
Conn.Open(); 
drLogins = cmd.ExecuteReader(); 
+0

난 여전히 같은 오류가 난다. – Raskaroth

+0

이것은 전혀 문제가 아니었지만 어쨌든 고마워! – Raskaroth

0

귀하의 @ac_status 매개 변수의 정수로 정의된다. 그것을 문자 또는 문자열로 변경하십시오.

SqlParameter acsParam = cmd.Parameters.Add("@ac_status", SqlDbType.Int); 
+0

내 잘못이지만, 문자열 [4]를 문자열 [3]으로 변경합니다. 오류 : P – Raskaroth

관련 문제