0

我正在尝试创建一个应用程序,允许某人通过 ID 搜索确切结果,或者如果您不知道 ID,您可以搜索他们姓名的一部分以返回匹配的帐户。

例如 Bob Jones 是 ID A01,您可以搜索 A01 以返回 Bob Jones 或搜索 B 以返回 Bob Jones、Bradley Smith 等。

由于某种原因,我对 ID 部分进行了很好的编码,当它实际上是相同的代码时,第二部分不起作用。

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())

您的 while 条件仅在没有更多记录可读取时才允许输入,因此它将无法执行内部逻辑。

你的逻辑有一些你应该解决的额外问题

  • 您面临使用字符串连接构建查询的 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

你还没有处理掉旧的DataReader. 我建议您严格更改所有内容以使用using块。这消除了所有这些问题。(也将连接包含在 using-blocks 中。如果在错误的时刻抛出异常,您将泄漏连接或读取器)。

于 2013-11-06T12:44:14.787 回答