0

だから私はエンティティフレームワークとC#を使用してサインアップメソッドを作成しようとします.これはメソッドです:

//Button create new account
    private void BtnSignUp_Click(object sender, EventArgs e)
    {
        IEnumerable<DriverAcount> list = from a in context.DriverAcounts select a;
        foreach (var Ac in list)
        {
                if (TxBoxNewUserName.Text != Ac.Login)
                {
                    if (TxtBoxPASS1.Text == TxBoxPass.Text)
                    {
                        Ac.Login = TxBoxNewUserName.Text;
                        Ac.Password = TxtBoxPASS1.Text;
                        context.DriverAcounts.Add(Ac);
                        MessageBox.Show("the account is create succefuly");
                        TxBoxNewUserName.Text = "";
                        TxtBoxPASS1.Text = "";
                        TxBoxPass.Text = "";
                        break;
                    }

                    else
                    {
                        MessageBox.Show("the two passwords didn't matched");
                    }

                    TxBoxNewUserName.Text = "";
                    TxtBoxPASS1.Text = "";
                    TxBoxPass.Text = "";
                    continue;
                }
            else
            {
                MessageBox.Show("this username is already exist, please choose another one");
                TxBoxNewUserName.Text = "";
                TxtBoxPASS1.Text = "";
                TxBoxPass.Text = "";
                break;
            }

        }
        context.SaveChanges();
    }

問題は、新しいユーザーを追加したいときです。通常、データベースに存在するかどうかを確認する必要がありますが、正しく実行されませんでした。たとえば、DB name1name2に 2 つの名前があり、TextBox にある場合などです。 name2 name2既に存在する場合でも、DBに追加します。誰かがアイデアを持っていれば、私はとても感謝しています。

4

1 に答える 1

0

コードをもう一度見て、コードが何をしているのかを正確に理解する必要があります。デバッガーを接続してステップ実行しましたか? foreach取得された最初の名前がテキスト ボックスの名前と一致しない場合、ドライバー名は常にループの最初の繰り返しで作成されます。他のすべては無視されます。

代わりにこれを試すことができます。レコードが既に存在するかどうかのみを確認したい場合は、すべてのレコードに対してクエリを実行する必要はありません (現在行っているように)。

private void BtnSignUp_Click(object sender, EventArgs e)
{
    // This performs a case sensitive match on the login name, you'll need to change it if you want to ignore case
    DriverAcount existingAccount = context.DriverAcounts.FirstOrDefault(d => d.Login == TxBoxNewUserName.Text);

    if (existingAccount != null)
    {
            MessageBox.Show("This username already exists, please choose another one.");
    }
    else
    {
            if (TxtBoxPASS1.Text == TxBoxPass.Text)
            {
                    Ac.Login = TxBoxNewUserName.Text;
                    Ac.Password = TxtBoxPASS1.Text;
                    context.DriverAcounts.Add(Ac);

                    // Only need to call this if you've made changes, so I've moved it here
                    context.SaveChanges();

                    MessageBox.Show("The account was created successfully");
            }
            else
            {
                    MessageBox.Show("The two passwords didn't match each other.");
            }
    }

    TxBoxNewUserName.Text = "";
    TxtBoxPASS1.Text = "";
    TxBoxPass.Text = "";
}
于 2013-03-31T12:59:12.290 に答える