使用 MySqlDataReader C#

Using MySqlDataReader C#

我正在尝试使用 mysqldatareader 在 C# 中填充一些文本框 Visual Studio。 我创建了连接字符串并创建了 MySqlDataReader 命令。

但是当我点击按钮进行操作时,它会显示一个消息框:“在调用 Read() 之前尝试访问字段无效”

这是我的代码:

 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));
            }                     
        }

我发现你的代码有很多问题:

  1. 它是西班牙语的 - 应该避免这种情况,尤其是当您需要非西班牙人的帮助时
  2. 您从不释放 IDisposable 对象(例如 MySqlConnection)
  3. 您在 try catch 中有一个无用的 try catch,而在内部 catch 中您没有处理异常
  4. 您的查询将参数作为字符串附加,而不是将参数作为 sql 参数传递,这使得您的代码容易受到 sql 注入
  5. 你正在做 Convert.ToString 个字符串
  6. 在您的查询中,group by 之前缺少 space,这将破坏语法

根据我的研究,您的问题是由于查询结果为空造成的。

我建议您在填写文本框之前判断查询结果。

您可以试试下面的代码:

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