Search code examples
c#mysqlvisual-studiodatareadermysqldatareader

Using MySqlDataReader C#


I'm trying to use mysqldatareader to fill some textboxes in C# Visual Studio. I've made the connection string and created the MySqlDataReader command.

But when I click in the button to make the action it shows me a messagebox saying: "Invalid attempt to access a field before calling Read()"

This is my code:

 private void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                MySqlConnection conexao = new MySqlConnection("server=localip; database=localdb; Uid=user; pwd=pass;");
                conexao.Open();
                MySqlCommand comando = new MySqlCommand();

                comando.CommandText = "select p.id, s.sku_id, p.commercial_description, pri.price, max(pri.start) as alterado_em from plu p " +
                        "inner join sku s on p.plu_key = s.plu_key inner join pricing pri on pri.plu_key = p.plu_key " +
                        "where p.id = " + txtCodbusca.Text + " group by pri.plu_key desc";
                comando.CommandType = CommandType.Text;
                comando.Connection = conexao;

                MySqlDataReader DR;
                DR = comando.ExecuteReader();
                DR.Read();
                txtCodinterno.Text = Convert.ToString(DR.GetDecimal(0));
                txtGtin.Text = Convert.ToString(DR.GetChar(1));
                txtDescricao.Text = (DR.GetString(2));
                txtPreco.Text = Convert.ToString(DR.GetDecimal(3));

                conexao.Close();
                HabBotoes();
            }
            catch (Exception ex)
            {
                MessageBox.Show(string.Format("{0}", ex.Message));
            }                     
        }

Solution

  • Based on my research, your problem is due to empty query results.

    I suggest that you can judge the query results before filling the textbox.

    You could try the following code:

         DR = comando.ExecuteReader();
                if (DR.HasRows)
                {
                    DR.Read();
                    txtCodinterno.Text = Convert.ToString(DR.GetDecimal(0));
                    txtGtin.Text = Convert.ToString(DR.GetChar(1));
                    txtDescricao.Text = (DR.GetString(2));
                    txtPreco.Text = Convert.ToString(DR.GetDecimal(3));
                }
               else 
                {
                    MessageBox.Show("The query result of p.id=" + txtCodbusca.Text + " is empty");
                }
         conexao.Close();