2016-08-23 10 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()を使用できます。次に、コマンドの実行は次のようになります:

string passwordStr= (string)com.ExecuteScalar(); 

のでgetPasswordメソッドのシグネチャも、その戻り値の型がList<StaffLogin>のために代わりに文字列となり、変更されます。新しいシグネチャは次のようになります。あなたはSqlDataAdapterオブジェクトを必要としませんが、あなただけのコマンドによって取得された最初の行の最初の列を返し、あなたは、ExecuteScalar SqlCommand.ExecuteScalar

 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(); 

を使用

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

クエリはこの条件にうまく適合します。ただし、クエリーが結果を生成しない場合は、ExecuteScalarがNULLを戻すことができるため、結果を使用する前に常にNULL値に対してテストすることを検討することが重要です。

別の問題では、これらの単純な仕事のためのストアドプロシージャを避けることをお勧めします。 AddWithValueの代わりにAddを使用し、パラメータの正確なサイズを指定すると、最適化されたクエリを作成するのに十分なヒントがSqlオプティマイザに与えられます。

最後に、クリアテキストでパスワードを保存/返すことは、非常に大きなセキュリティリスクとみなされます。この質問で説明されているように、より安全な方法を試してください:Best way to store passwords in a database

関連する問題