0

私は、1 つのクライアントと 1 つのサーバーを持つプロジェクトに取り組んでいます。また、コードを配置するクラス ライブラリも作成し、このクラス ライブラリをサーバーとクライアントのリファレンスとして作成しました。そのため、クラスのオブジェクトを作成してクライアントからメソッドを呼び出します。そして、それは非常にうまく機能しています...今まで!

クラスライブラリには、ユーザー名が既に存在するかどうかを確認する Check() というメソッドがあります (登録しようとしたときなど)。しかし、問題は、データベースからのユーザー名を確認するステップがスキップされていることです!!理由がわからない、なぜエラーが表示されない. 発生する唯一のエラーは、スキップされたステップのために同じユーザー名をデータベースに挿入しようとしたときに表示されるエラーです.

クラス ライブラリ コードは次のとおりです。

    bool busy = false;
    bool empty = false;
    bool notSame = false;
    bool completed = false;

public void Check(string a1, string b2, string c3, string d4, string e5, string f6)
    {
        SqlConnection con = new SqlConnection(@"Data Source=TALY-PC;Initial Catalog=TicTacToe;Integrated Security=True");

        SqlCommand cmd = new SqlCommand("SELECT * FROM tblUsers", con);

        if (con.State.Equals(ConnectionState.Open))
        {
            return;
        }
        else
        {
            con.Open();
        }

        SqlDataReader dr = cmd.ExecuteReader();

        while (dr.Read())
        {

            if (dr["Username"].ToString() == d4)
            {
                busy = true;
            }
            else if (a1 == "" || b2 == "" || c3 == "" || d4 == "" || e5 == "" || f6 == "")
            {

                empty = true;

            }
            else if (e5 != f6)
            {
                notSame = true;
                return;
            }
            else
            {
                dr.Close();
                SqlCommand cmd1 = new SqlCommand("INSERT INTO tblUsers (Name, LastName, email, Username, Password) VALUES ('" + a1 + "', '" + b2 + "', '" + c3 + "', '" + d4 + "', '" + e5 + "')", con);

                cmd1.ExecuteNonQuery();

                completed = true;
            }
        }

そして、スキップされた部分はこの部分です:

if (dr["Username"].ToString() == d4)
            {
                busy = true;
            }

なぜこの部分をチェックしないのかわかりませんか??

クライアントからのコードは次のとおりです。

HttpChannel chan = new HttpChannel();

    Tic obj = (Tic)Activator.GetObject(typeof(Tic), "http://127.0.0.1:9050/MyMathServer");

private void RegisterForm_Load(object sender, EventArgs e)
    {
        ChannelServices.RegisterChannel(chan);
    }

 private void Button1_Click(object sender, EventArgs e)
   {
 obj.Check(textBoxX1.Text, textBoxX2.Text, textBoxX3.Text, textBoxX4.Text, textBoxX5.Text, textBoxX6.Text);
        label8.Text = obj.getUseri();
        if (obj.getBusy() == true)
        {
            MessageBox.Show("This username is already Taken, please choose another username");

            obj.setBusy();

        }
        else if (obj.getEmpty() == true)
        {
            MessageBox.Show("Please fill all the fields!");
            obj.setEmpty();
        }
        else if (obj.getNotSame() == true)
        {
            MessageBox.Show("Passwords don't match!!");
            textBoxX5.Text = "";
            textBoxX6.Text = "";
            obj.setNotSame();
        }
        else if (obj.getCompleted() == true)
        {
            MessageBox.Show("Registration was completed successfully. Please close the window and Log Int ");
            textBoxX1.Text = "";
            textBoxX2.Text = "";
            textBoxX3.Text = "";
            textBoxX4.Text = "";
            textBoxX5.Text = "";
            textBoxX6.Text = "";
            obj.setCompleted();

        }
  }

ユーザー名をチェックしない理由を教えてください。

4

1 に答える 1

1

私はあなたのコードを正確に理解していません。私はいくつかの簡単な観察をすることができます:

  • まず第一にusing、接続とデータリーダーの使用。何が起こっても(例外など)、usingそれらを閉じます。
  • 変数にはより適切な名前を使用してください。何も意味しないa1まで。f6それらに意味のある名前を付けると、読みやすくなります...だから... e5がf6と等しくなければならない理由が本当にわからない場合。
  • 同じことがテキストボックスにも当てはまります。
  • ステートメントif (a1 == "" || b2 == "" || c3 == "" || d4 == "" || e5 == "" || f6 == """)は while ループ内にありますが、これらの値は変更されないため、ループの外に移動することを検討してください。
  • 行についても同じことが言えif (e5 != f6)ます。
  • 接続が開いているかどうかを確認します。しかし、この接続は作成されたばかりです。どうすれば開くことができますか?で、開いていたら……何もせずに戻ってくるの?
  • 条件に到達(e5 != f6)し、条件が true の場合、戻ります。ただし、接続を閉じずにそうします。
  • すべてのパラメーターが""であるが、データベースにレコードがないempty場合は、設定されません。これは設計によるものですか?

このコードを試してください:

public enum Result
{
    Busy,
    Empty,
    NotSame,
    Completed
}

public Result Check(string name, string lastName, string eMail, string userName, string password1, string password2)
{
    // You should check with String.IsNullOrEmpty(...), not just an empty string.
    if (name == "" || lastName == "" || eMail == "" || userName == "" || password1 == "" || password2 == "")
        return Result.Empty;

    if (password1 != password2)
        return Result.NotSame;

    using(SqlConnection con = new SqlConnection(@"Data Source=TALY-PC;Initial Catalog=TicTacToe;Integrated Security=True"))
    {
        SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM tblUsers WHERE UserName=@0", con);
        cmd.Parameters.AddWithValue("@0", userName);
        int count = (int)cmd.ExecuteScalar();
        if (count > 0)
            return Result.Busy;

        // I must admit, also the insert values should be done with SqlParameters.
        cmd = new SqlCommand("INSERT INTO tblUsers (Name, LastName, email, Username, Password) VALUES ('" + name + "', '" + lastName + "', '" + eMail + "', '" + userName + "', '" + password1 + "')", con);
        cmd.ExecuteNonQuery();
        return Result.Completed;
    }
}
于 2013-04-28T00:16:44.417 に答える