2016-10-11 7 views
2

私は簡単なSqlConnectionコードを持っています。HASHBYTESという機能を持っていますので、サーバーからデータを取得できます。SqlCommandがHASHBYTES関数内でパラメータを渡さないのはなぜですか?

using (var connection = new SqlConnection(connectionString)) 
{ 
    connection.Open(); 

    using (var command = new SqlCommand(commandString, connection)) 
    { 
     command.Parameters.Add(new SqlParameter("mail", email)); 
     command.Parameters.Add(new SqlParameter("password", password)); 
     using (var reader = command.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       return true; 
      } 
      throw new InvalidDataException(); 
     } 
    } 
} 

プロパティをのCommandString は次のようになります。

DECLARE @pass varchar(50); 
SET @pass = @password; 

DECLARE @pwdHash varbinary(max); 
SET @pwdHash = HASHBYTES('SHA2_256', @pass); 

SELECT * FROM Users 
WHERE [email protected] AND [email protected]; 

このコードは動作しますが、なぜ仕事下記の短いコードではないでしょうか?

以下のケースでは、関数はwhileループの内部にはなく、代わりに例外をスローします。これらのコードの両方で

DECLARE @pwdHash varbinary(max); 
SET @pwdHash = HASHBYTES('SHA2_256', @password); 

SELECT * FROM Users 
WHERE [email protected] AND [email protected]; 

@password値はSqlParameterとして設定されているので、それが動作するはず、右?または私は何かを逃していますか?

+2

実行時の実際の違いは何ですか? 「うまくいきません」とは記述的なものではありません。それはクラッシュする/例外をスローしますか?ゼロを返しますか? – Dai

+1

どのようなエラーがありましたか? –

+0

申し訳ありませんが、上のコードではtrueを返し、下のコードではwhileループにヒットしないため、例外がスローされます。 –

答えて

6

デフォルトでは、文字列パラメータはnvarcharとして渡されます。長い方のコマンドは@passwordvarcharにキャストしています。バイナリ表現が異なるため、異なるハッシュダイジェストが生成されます。異なるハッシュダイジェストは、ハッシュが異なる場合に既存のレコードと一致しません。

ところで、ハッシュも塩漬けする必要があります。

+0

優れた答え! 6分、あなたは受け入れられた答えを得る。 –

関連する問題