0

ID を介して正確な結果を検索できるアプリケーションを作成しようとしています。ID がわからない場合は、名前の一部を検索して、一致するアカウントを返すことができます。

たとえば、Bob Jones は ID A01 です。A01 を検索して Bob Jones を返すか、B を検索して Bob Jones、Bradley Smith などを返すことができます。

私は ID 部分をうまくコーディングしましたが、実際には同じコードである場合、2 番目の部分が機能しません。

private void btnSaveEmployees_Click(object sender, EventArgs e)
{
    {
        //First search for the entered text to see if it is an ID
        DataBase db = new DataBase(); //Construct a new database.
        db.OpenConnection(); //Open our Database connection

        MySqlCommand mysqlCmd = new MySqlCommand("SELECT * FROM `employees` WHERE `employee_ID` = @employeeID LIMIT 1", db.connection);
        mysqlCmd.Parameters.AddWithValue("@employeeID", txtEmployeeID.Text);

        MySqlDataReader reader = mysqlCmd.ExecuteReader(); //Construct a reader 

        if (reader.Read())
        {
            //Employee ID has been found so lets update the update form.
            Form employee = new UpdateEmployee(reader["firstName"].ToString(), reader["lastName"].ToString(), reader["contactNumber"].ToString(), reader["employee_access_level"].ToString());
            employee.Show();
        }
        else
        {
            db.CloseConnection();
            db.OpenConnection();
            MySqlDataReader Reader2;
            MySqlCommand mysqlCmd2 = new MySqlCommand("SELECT firstName, LastName FROM `employees` WHERE `firstName` LIKE '"+txtEmployeeID.Text+"';", db.connection);
            //mysqlCmd2.Parameters.AddWithValue("@textbox", txtEmployeeID.Text);
            Reader2 = mysqlCmd2.ExecuteReader(); //Construct a reader

            while (Reader2.Read()==false)
            {
                listboxFindEmployees.Visible = true;
                string thisrow = "";

                for (int i = 0; i < Reader2.FieldCount; i++)
                    thisrow += Reader2.GetValue(i).ToString() + ",";

                listboxFindEmployees.Items.Add(thisrow);
            }
        }
    }
}
4

3 に答える 3

2

一見すると、変更する必要があります

while (Reader2.Read()==false)

while (Reader2.Read())

条件は、読み取るレコードがなくなったときにのみ入力できるため、内部のロジックの実行に失敗します。

あなたのロジックには、対処すべき余分な問題があります

  • 文字列連結を使用してクエリを作成する SQL インジェクション攻撃にさらされています。代わりにパラメーターを使用してください。
  • インターフェイスを実装するすべてのインスタンスを解放する必要がありIDisposableます (MySqlConnection、MySqlDataReader、MySqlCommand)
于 2013-11-06T12:43:32.337 に答える
1

この行:

while (Reader2.Read()==false)

次のようにする必要があります。

while (Reader2.Read())
于 2013-11-06T12:48:14.043 に答える
0

古いものを処分していませんDataReaderusingブロックを使用するようにすべてを厳密に変更することをお勧めします。それはこれらの問題をすべて取り除きます。(また、接続を using ブロックで囲みます。間違ったタイミングで例外がスローされた場合、接続またはリーダーがリークします)。

于 2013-11-06T12:44:14.787 に答える