使用 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));
}
}
我发现你的代码有很多问题:
- 它是西班牙语的 - 应该避免这种情况,尤其是当您需要非西班牙人的帮助时
- 您从不释放 IDisposable 对象(例如 MySqlConnection)
- 您在 try catch 中有一个无用的 try catch,而在内部 catch 中您没有处理异常
- 您的查询将参数作为字符串附加,而不是将参数作为 sql 参数传递,这使得您的代码容易受到 sql 注入
- 你正在做 Convert.ToString 个字符串
- 在您的查询中,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();
我正在尝试使用 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));
}
}
我发现你的代码有很多问题:
- 它是西班牙语的 - 应该避免这种情况,尤其是当您需要非西班牙人的帮助时
- 您从不释放 IDisposable 对象(例如 MySqlConnection)
- 您在 try catch 中有一个无用的 try catch,而在内部 catch 中您没有处理异常
- 您的查询将参数作为字符串附加,而不是将参数作为 sql 参数传递,这使得您的代码容易受到 sql 注入
- 你正在做 Convert.ToString 个字符串
- 在您的查询中,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();