2012-05-30 2 views
4

문자열 필드 username을 기반으로 단일 테이블에서 정수 값을 검색하려고합니다. 저장 프로 시저 및 직접 텍스트를 사용하여 시도했습니다. 저장된 proc을 실행할 때 적절한 반환 값을 얻습니다. 그러나 적절한 결과는 나오지 않습니다. 여기 쿼리에서 단일 값 검색

코드의 두 세트입니다 - 직접 텍스트 -

public int GetUserRole(string CUSER) 
{ 
    try 
    { 
     SQLCON = new SqlConnection(connectionString); 
     SQLCON.Open(); 
     SQLCommand = new SqlCommand(); 
     SQLCommand.CommandType = CommandType.Text; 
     SQLCommand.Parameters.Add("USUsername", SqlDbType.VarChar).Value = CUSER; 
     SQLCommand.CommandText = "SELECT USRole FROM tblUser WHERE USUsername = CUSER"; 
     Int32 USRole = (Int32) SQLCommand.ExecuteScalar(); 

     return USRole; 

    } 
    catch 
    { 
     HttpContext.Current.Response.Redirect("~/ErrorRedirect.aspx", false); 
     return 0; 
    } 
} 

SQL 쿼리 :

ALTER PROCEDURE [dbo].[spGetUserRole] 
-- Add the parameters for the stored procedure here 
    @username VARCHAR(50) 
AS 
BEGIN 
-- Declare the return variable here 
DECLARE @USRole as int 

-- Add the T-SQL statements to compute the return value here 
SELECT @USRole = tblUser.USRole FROM tblUser WHERE USUsername = @username 

-- Return the result of the function 
RETURN @USRole 
END 

답변

8

매개 변수를 올바르게 참조하지 않습니다. 당신이 USUsername라는 매개 변수를 추가하는 경우 다음 명령 텍스트에서 당신은 @USUsername 사용해야합니다

public int GetUserRole(string CUSER) 
{ 
    try 
    { 
     SQLCON = new SqlConnection(connectionString); 
     SQLCON.Open(); 
     SQLCommand = new SqlCommand(); 
     SQLCommand.CommandType = CommandType.Text; 
     SQLCommand.Parameters.Add("USUsername", SqlDbType.VarChar).Value = CUSER; 
     SQLCommand.CommandText = "SELECT USRole FROM tblUser WHERE USUsername = @USUsername"; 
     Int32 USRole = (Int32) SQLCommand.ExecuteScalar(); 

     return USRole; 

    } 
    catch (Exception) 
    { 
     HttpContext.Current.Response.Redirect("~/ErrorRedirect.aspx", false); 
     return 0; 
    } 
} 

귀하의 저장 프로 시저가 아니라도 일치해야합니다 여기에 매개 변수 이름으로 업데이트해야합니다 당신이 반환 변수가 필요하지 않습니다 .

ALTER PROCEDURE [dbo].[spGetUserRole] 
-- Add the parameters for the stored procedure here 
@USUsername VARCHAR(50) 

AS 
BEGIN 

-- Add the T-SQL statements to compute the return value here 
SELECT tblUser.USRole FROM tblUser WHERE USUsername = @USUsername 

END 

"사용"구문을 사용하여 데이터베이스 연결을 자동으로 닫아야합니다.여기 스콧 Hanselman은의 예를 참조하십시오 - http://www.hanselman.com/blog/WhyTheUsingStatementIsBetterThanASharpStickInTheEyeAndASqlConnectionRefactoringExample.aspx 당신이 다음 단지에 proc 디렉토리를 변경 ExecuteScalar는을 사용하려는 경우 ExecuteNonQuery는

SqlParameter p = cmd.Parameters.Add("@USRole", SqlDbType.Int); 
p.Direction = ParameterDirection.ReturnValue; 
cmd.ExecuteNonQuery(); 
int returnvalue = (int)cmd.Parameters["@USRole"].Value; 

을 매개 변수의 방향을 설정하고 사용하여 작업을 수행 할 수 있습니다 반환 값을 사용하여 주장하는 경우

+0

Int32 USRole = (Int32) SQLCommand.ExecuteScalar(); 오류를 처리하는 대신 캐스팅 할 캐스팅 된 레코드가 0이면 일반 catch를 사용하여 catch에 삼가고 Exception을 반환하고 0을 반환합니다. –

1

대신 저장 프로 시저 (RETURN @USRole)의 반환 값을 사용하여 결과를 다시 보내 Select 문을 사용하십시오 (예 : Select @USRole). 저장 프로 시저의 반환 값은 ExecuteScalar에서 사용하는 것과 다릅니다. ExecuteScalar는 출력의 첫 번째 열과 행을 반환합니다. 반환 값은 다르며 특별히 명명 된 매개 변수 @RETURN_VALUE 또는 특수한 ParameterDirection.ReturnValue 속성을 사용하여 액세스해야합니다. 제대로

ALTER PROCEDURE [dbo].[spGetUserRole] 
-- Add the parameters for the stored procedure here 
@USUsername VARCHAR(50) 

AS 
BEGIN 

-- Add the T-SQL statements to compute the return value here 
Select tblUser.USRole 
FROM tblUser 
WHERE USUsername = @USUsername 

END 

RETURN (Transact-SQL)

SqlCommand.ExecuteScalar Method

+0

감사합니다. 너무 심하게 괴롭히는 일이 너무 단순합니다. 매우 감사! –

+0

@ 토마스. "특별히 명명 된 매개 변수 @ RETURN_VALUE"에 대한 비트는 서버에서 매개 변수를 파생 한 경우에만 true입니다. 'SqlCommandBuilder.DeriveParameters (cmd);'. 그렇지 않으면'ParameterDirection.ReturnValue'가 중요하고 이름은 임의입니다. –

0

사용 매개 변수 :

프로 시저의 수정 된 버전과 같을 것이다. 그리고 마침내 성명에 연결을 닫지 잊지.

public int GetUserRole(string CUSER) 
    { 
     try 
     { 
      SQLCON = new SqlConnection(connectionString); 
      SQLCON.Open(); 
      SQLCommand = new SqlCommand(); 
      SQLCommand.CommandType = CommandType.Text; 
      SQLCommand.CommandText = "SELECT USRole FROM tblUser WHERE USUsername = @USUsername "; 
      SQLCommand.Parameters.Add("USUsername", SqlDbType.VarChar).Value = CUSER; 

      Int32 USRole = (Int32) SQLCommand.ExecuteScalar(); 

      return USRole; 

     } 
     catch (Exception) 
     { 
      HttpContext.Current.Response.Redirect("~/ErrorRedirect.aspx", false); 
      return 0; 
     } 
     finally { close connection here.. } 

    } 
1

난 당신이 저장 프로 시저를 호출하는 방법을 잘 모릅니다,하지만 당신은 게시 된 쿼리에 버그 프로그래머 :

"SELECT USRole FROM tblUser WHERE USUsername = CUSER" 

SQLCommand.Parameters.Add("@USUsername", SqlDbType.VarChar).Value = CUSER; 
"SELECT USRole FROM tblUser WHERE USUsername = @USUsername" 


로 대체해야합니다 당신은 현재 실제로 매개 변수를 쿼리의 일부로 만들고 있지 않지만 열 내에서 CUSER 값을 찾으려고 시도합니다.

0

select 변수 대신 Return

매개 변수 이름에 입력하는 내용은 임의적입니다.

관련 문제