2016-04-26 9 views
0

にパラメータをバインド、私は働く、以下のプリペアドステートメントを持っている:のJavaのPreparedStatement:今HASHBYTES

SELECT email, password 
FROM Professor 
WHERE email = ? AND password = HASHBYTES('SHA1','" + password + "') 

p.setString(1, email); 

をしかし、私はこのケースでは(HASHBYTESによって暗号化される値をパラメータ化しようとすると、変数'パスワード')、結果を返さない種類の読み取り/型/変換エラーがあります。これは動作しないコードです:

SELECT email, password 
FROM Professor 
WHERE email = ? AND password = HASHBYTES('SHA1', ?) 

p.setString(1, email); 
p.setString(2, password); 

エラーメッセージはまったく表示されません。結果セットはrowCountプロパティに "-3"を返します。私はSQL Serverを使用しています。

「パスワード」のようなプレースホルダを渡す:'?'もどちらも機能しません。このクエリをパラメータ化する正しい方法は何でしょうか?

+1

どのようなエラーメッセージが表示されますか?どんなSQLサーバーに話しかけていますか? (MySQL、SQL Server、Oracle?) –

+0

エラーメッセージはまったくありません。結果セットは、 "-3"をrowCountプロパティに返します。私はSQL Serverを使用しています。 この情報を質問に追加します。 – KarasuEXE

答えて

0

はあなたのすべてを指摘し、SQL Serverの型を変換する方法について研究し、私は次のコードに来ました:

select email, password 
    from Professor 
where email = ? 
    and senha = hashbytes('sha1', convert(varchar, ?)) 

してください、それはあなたのために働くかどうかを確認します!

+0

それは完璧に働いた、ありがとう。 – KarasuEXE

0

このように、このSQL Server sha1 value in prepared statement gives a different value than hardcoded string

p.s 答えを見に、私はまだコメントテキストことができないため。情報を使用して

+0

ありがとうございます。 VARCHAR型とNVARCHAR SQL型の違いが答えの鍵となるようです。 しかし、変数型をさまざまな方法(setNString、Types.NVARCHAR)で変更しようとしましたが、クエリを に変更しようとしました。 'WHERE email =? ANDパスワード=ハッシュビート( 'SHA1'、N?)ですが成功しません。必要な変更を策定する手助けはできますか? – KarasuEXE

関連する問題