3

次の関数の何が問題なのか、誰でも気付くことができますか?

public string Login(string username, string password)
    {
        string result = "";
        string select = "SELECT user_id FROM [user] WHERE username = @username AND password = @password";
        SqlConnection conn = new SqlConnection(connectionString);
        SqlCommand cmd = new SqlCommand(select, conn);
        cmd.Parameters.AddWithValue("username", username);
        cmd.Parameters.AddWithValue("password", password);
        int userID = 0;
        try
        {
            conn.Open();
            userID = (int)cmd.ExecuteScalar();
            if(userID > 0)
            {
                result = addSession(userID);
            }
        }
        catch(Exception ex)
        {
            string sDummy = ex.ToString();
        }
        return result;
    }

行 `userID = (int)cmd.ExecuteScalar(); の理由がわからない 例外をスローします。

ありがとう

4

6 に答える 6

6

ほとんどの場合、そのユーザー/パスワードを含む行がテーブルにありません。ExecuteScalarのドキュメントによると、結果セットが空の場合は null が返され、null を int にキャストすることはできません。

于 2009-03-24T03:02:52.127 に答える
2

このコード セグメントを変更することを検討する必要があります。

try
{
    conn.Open();
    userID = (int)cmd.ExecuteScalar();
    if(userID > 0)
    {
        result = addSession(userID);
    }
 }
 catch(Exception ex)
 {
    string sDummy = ex.ToString();

 }
 finally // add this to ensure the connection is closed!
 {
     if (conn != null)
       conn.Close();
 }
于 2009-03-24T02:52:57.127 に答える
1

提供された資格情報がデータベースで見つからない場合、スカラーが null である可能性はありますか?

于 2009-03-24T03:00:16.797 に答える
0

hashbytes 関数は表示されませんが、次のようになります。

hashbytesバックエンド SQL サーバーで関数を使用している場合は、パスワード入力をバイナリ配列に変換します。Hashbytes は varbinary を返します。したがって、ヌル ターミネータを渡すと、ハッシュは同じにはなりません。SQL のようにhashbytes('SHA2_512,'stuff')、's'、't'、'f' をハッシュするようなものです。末尾に '\0' はありません。ただし、sqlcommand オブジェクトで文字列としてパラメーター化すると、最後に '\0' が追加され、SQL はそのゼロを計算します。したがって、Encodingクラスを使用してバイナリ配列に変換すると、パラメーターは null ターミネーターのない単なる文字列になります。同様の問題が発生し、その方法で解決しaddwithvalue、その値をバイナリとして使用しました。

しかし、executecalar がオブジェクトを返すことはご存知でしょう。クエリがゼロ行を返す場合、オブジェクトは NULL になり、NULL オブジェクトをキャストまたは変換することはできません。したがって、if ステートメントでは、「if returnobject == null then you are not authed.else....」と言います。

于 2016-08-29T11:12:38.103 に答える
0

私はSqlCEで同じ問題を抱えていました。私が見つけた解決策 (パスワードを正しく入力し始めた後... >.> ) は、最初に ExecuteScalar の結果をオブジェクトとして収集し、次に変換することでした。文字通り、

Object o = cmd.ExecuteScalar(); 
int id = Convert.ToInt32(o); 

それ以外の

int id = (int) cmd.ExecuteScalar(); 

動作とクラッシュの違いでした。それがなぜなのかはわかりませんが...

于 2012-11-26T07:48:13.370 に答える
0

確かではありませんが、パラメーター名に「@」が必要になる場合があります。

...AddWithValue("@username", username);
于 2009-03-24T02:53:28.873 に答える