2016-08-23 2 views
0

저장 프로 시저를 사용하여 데이터베이스에서 '암호'값을 가져옵니다. 이 값을 변수에 할당해야합니다. asp.net- mvcAdo.net을 사용하고 있습니다. 여기에 저장 프로 시저가 있습니다.저장 프로 시저의 값을 변수에 할당

CREATE PROCEDURE [dbo].[getPassword] 
(
@Email VARCHAR(100) 
) 
AS 
BEGIN 
SELECT Password FROM dbo.Staff_Login WHERE [email protected] 
END 

다음은 내 저장소 클래스입니다.

나는 목록을 사용하고 있습니다. 그러나 나는 변수에 가치를 할당해야합니다. 왜냐하면 나는 오직 하나의 값 (암호)이 필요하기 때문이다.

답변

1

이 경우 단일 열의 값을 검색하는 경우 이러한 상황에서는 ExecuteScalar()을 사용할 수 있습니다. 그런 다음 명령의 실행은 다음과 같이 될 것입니다 :

는 그래서 getPassword 방법의 서명도 변경됩니다
string passwordStr= (string)com.ExecuteScalar(); 

, 그것의 반환 형식이 List<StaffLogin> 대신 문자열이 될 것이다; 새로운 서명은 다음과 같습니다

public string getPassword(StaffLogin obj) 
{ 
    connection(); 
    string passwordStr = String.Empty; 
    using (SqlCommand com = new SqlCommand("getPassword", con)) 
    { 
     com.CommandType = CommandType.StoredProcedure; 
     com.Parameters.AddWithValue("@Email", obj.Email); 
     passwordStr = (string)com.ExecuteScalar(); 
    } 
    return passwordStr; 
} 
2

 connection(); 
     SqlCommand com = new SqlCommand("getPassword", con); 
     com.CommandType = CommandType.StoredProcedure; 
     com.Parameters.Add("@Email",SqlDbType.NVarChar, 100). Value = obj.Email; 
     con.Open(); 
     var result = com.ExecuteScalar();    
     if(result != null) 
      MessageBox.Show("Password = " + result.ToString(); 
     con.Close(); 

ExecuteScalar는 명령과에 의해 검색된 첫 번째 행의 첫 번째 열을 반환 SqlCommand.ExecuteScalar을 당신은 SqlDataAdapter를 필요하지 않습니다하지만 당신은 그냥 사용 쿼리가이 조건에 적합합니다. 그러나 쿼리가 결과를 생성하지 않으면 ExecuteScalar가 NULL을 반환 할 수 있으므로 항상 사용하기 전에 결과를 null 값에 대해 테스트해야합니다.

또 다른 문제는 사용하기 좋은 이유가없는 한 이러한 간단한 일상 작업에 대한 저장 프로 시저를 피하기를 권장합니다. AddWithValue 대신 Add를 사용하고 매개 변수의 정확한 크기를 지정하면 최적화 된 쿼리를 만들 수있는 충분한 힌트가 SQL Optimizer에 제공됩니다.

마지막으로 암호를 일반 텍스트로 저장/반환하는 것은 매우 큰 보안 위험으로 간주됩니다. 이 질문에서 설명한 것처럼 안전한 방법을 사용해보십시오 : Best way to store passwords in a database