在调用Read()C#之前无法尝试访问字段

时间:2013-11-06 12:41:44

标签: c#

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

例如,鲍勃琼斯是身份证A01,你可以搜索A01返回鲍勃琼斯或搜索B返回鲍勃琼斯,布拉德利史密斯e.t.c ......

我已经将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);
            }
        }
    }
}

3 个答案:

答案 0 :(得分:2)

乍一看,你需要改变

while (Reader2.Read()==false)

通过

while (Reader2.Read())

虽然条件只允许在没有更多记录要读时进入,但它将无法执行内部逻辑。

你的逻辑还有一些额外的问题需要解决

  • 您接触到使用字符串连接构建查询的SQL注入攻击。请改用parameters
  • 您必须释放实现IDisposable接口的每个实例(MySqlConnection,MySqlDataReader,MySqlCommand)

答案 1 :(得分:1)

这一行:

while (Reader2.Read()==false)

应该是:

while (Reader2.Read())

答案 2 :(得分:0)

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