1

codesamplez.comのように、 LINQtoSQLの非常に単純なユーザー認証について説明しているこのサイトを見つけました。

データベース内の私のデータは次のようになります

| id  | name | password |
+-----+------+----------+
| 1   | tic  | test     |
| 2   | tac  | test     |
| 3   | toe  | test     |

なんらかの奇妙な理由で、私が電話したときに、データが期待どおりに検証されません

 bool b  = IsValidUser("tic" , "test");

これは戻りますFALSEが、同じユーザー名とパスワードの組み合わせを渡すときはいつでも

 bool b  = IsValidUser("tic" , "tic");

また

 bool b  = IsValidUser("a" , "a");

また

 bool b  = IsValidUser("b" , "b");

戻りますtrue

以下は、参照ページと基本的に同じコードです。

public bool IsValidUser(string userName, string passWord)
{
    DataClasses1DataContext db = new DataClasses1DataContext();
    var users = from u in db.Users
                      where u.name == userName
                      && u.password == passWord
                      select u;

    return Enumerable.Count(users) > 0;
}

更新: Userクラス:

[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Users")]
public partial class User
{
    private int _id;
    private string _name;
    private string _password;

    public User()
    {
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_id", DbType="Int NOT NULL")]
    public int id
    {
        get
        {
            return this._id;
        }
        set
        {
            if ((this._id != value))
            {
                this._id = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_name", DbType="NChar(10)")]
    public string name
    {
        get
        {
            return this._name;
        }
        set
        {
            if ((this._name != value))
            {
                this._name = value;
            }
        }
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_password", DbType="NChar(10)")]
    public string password
    {
        get
        {
            return this._password;
        }
        set
        {
            if ((this._password != value))
            {
                this._password = value;
            }
        }
    }
}
4

4 に答える 4

1

みんなありがとう、今はすべて非常に役立つ情報です。これは私自身の間違いでした。データベースには期待したデータがありませんでした。2 つのデータベース サーバーがあり、新しいデータは開発サーバーに複製されていませんでした。

于 2012-11-09T03:37:34.663 に答える
0

これを試して、

public bool IsValidUser(string userName, string passWord)
{
    DataClasses1DataContext db = new DataClasses1DataContext();
    return db.Users.Any(u => u.name == userName && u.password == passWord);
}
于 2012-11-09T03:28:40.953 に答える
0

問題が何であるかはわかりませんが、これにより詳細情報が得られるはずです。

public bool IsValidUser(string userName, string passWord)
{

    DataClasses1DataContext db = new DataClasses1DataContext();
    db.Log = System.IO.StringWriter(New StringBuilder());

    var users = from u in db.Users
                where u.name == userName
                && u.password == passWord
                select u;

    int userCount = users.Count();
    bool isSuccess = userCount > 0;

    return isSuccess;   //Breakpoint here, check the contents of db.Log
}

リターンにブレークポイントを置くと、userCountとを調べることができますisSuccessdb.Logまた、実行されたクエリを確認することもできます。

これで問題が解決しない場合は、返信時にこれら 3 つの変数の値を使用して質問を更新してください。

更新 私はちょうどあなたの更新を見ました。間違ったIsValidUserメソッドを参照しているようです。呼び出している場所に移動し、右クリックしIsValidUserて[定義に移動]を選択して、正しいメソッドが呼び出されていることを確認します。また、最新のビルドを使用していることを確認してください。

于 2012-11-09T03:22:12.113 に答える
0

これを試して:

public bool IsValidUser(string userName, string passWord)
{
    using (var db = ...)
    {
        ...
        return users.Any();
    }
}
于 2012-11-09T03:24:35.510 に答える