-1

我正在尝试使用 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));
            }                     
        }
4

2 回答 2

0

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

我建议你可以在填充文本框之前判断查询结果。

您可以尝试以下代码:

     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();
于 2020-08-12T06:26:40.267 回答
0

我在您的代码中看到了很多问题:

  1. 它是西班牙语 - 应该避免,特别是如果您需要非西班牙人的帮助
  2. 你永远不会处理 IDisposable 对象(例如 MySqlConnection)
  3. 您在尝试捕获中有一个无用的尝试捕获,而在内部捕获中您没有处理异常
  4. 您的查询将参数附加为字符串,而不是将参数作为 sqlparameters 传递,这使您的代码容易受到 sql 注入的影响
  5. 你正在做一个字符串的 Convert.ToString
  6. 在您的查询中,group by 之前缺少一个空格,这将破坏语法
于 2020-08-11T12:48:17.637 回答