【问题标题】:ERROR: There is already an open DataReader associated with this Connection which must be closed first.'错误:已经有一个打开的 DataReader 与此连接关联,必须先关闭它。
【发布时间】:2019-09-09 21:56:37
【问题描述】:

我需要找到 DataReader 的打开位置或解释此错误并解决的问题,请帮助我,我已经尝试了所有方法!

我已经关闭了代码的所有连接。我已经尝试在我的连接中使用多个活动结果集。

namespace Aula05
{
    public partial class frmImportar : Form
    {

        #region Eventos

        private void btnProcurar_Click(object sender, EventArgs e)
        {
            if (ofdAbrir.ShowDialog() == DialogResult.OK)
            {
                txtNome.Text = ofdAbrir.FileName;
                btnImportar.Enabled = true;
            }
        }

        private void btnImportar_Click(object sender, EventArgs e)
        {
            Importar();
            MessageBox.Show("Importação realizada com sucesso");
        }

        #endregion

        #region Métodos

        public frmImportar()
        {
            InitializeComponent();
        }

        public void Importar()
        {
            StreamReader leitor = new StreamReader(txtNome.Text);
            String linha = String.Empty;

            while (!leitor.EndOfStream)
            {
                linha = leitor.ReadLine();

                String[] dados = linha.Split(';');
                string nome = dados[0];
                string cpf = dados[1];
                string idunidade = dados[2];


                Conexao c = new Conexao();

                c.Abrir();

                MySqlCommand cmd = new MySqlCommand("select * from colaborador where CPF = @CPFC");
                cmd.Parameters.Add(new MySqlParameter("CPFC", cpf));

                MySqlDataReader leia = c.Pesquisar(cmd);

                if (leia.Read())
                {
                    cmd = new MySqlCommand("update colaborador set Nome = @NomeC, idUnidade = @idUnidadeC where CPF = @CPFC");
                    cmd.Parameters.Add(new MySqlParameter("NomeC", nome));
                    cmd.Parameters.Add(new MySqlParameter("idUnidadeC", cpf));
                    c.Executar(cmd);                   
                    c.Fechar();
                    leia.Close(); 
                }
                else

                {                    
                    cmd = new MySqlCommand("insert into colaborador values (default, @NomeC, @CPFC, @idUnidadeC");
                    cmd.Parameters.Add(new MySqlParameter("NomeC", nome));
                    cmd.Parameters.Add(new MySqlParameter("CPFC", cpf));
                    cmd.Parameters.Add(new MySqlParameter("idUnidadeC", idunidade));
                    c.Executar(cmd);
                    c.Fechar();
                    leia.Close();

                }                

            }
        }
        #endregion
    }
}

解释代码:我需要获取一个excel表,检查sql数据库中是否已经存在cpf(类似id的东西),如果我已经在数据库中我需要更改数据,如果不包括客户端数据库。

【问题讨论】:

  • 哪行代码给出了错误?
  • 我不知道,只是有一个数据阅读器打开但不知道它在哪里
  • 如果你调试你的代码,你就会知道我们在哪一行破坏了代码。

标签: c# forms


【解决方案1】:

在执行另一个命令之前关闭leia

MySqlCommand cmd = new MySqlCommand("select * from colaborador where CPF = @CPFC");
cmd.Parameters.Add(new MySqlParameter("CPFC", cpf));

MySqlDataReader leia = c.Pesquisar(cmd);
leia.Close();

如果不行,那么

MySqlCommand cmd = new MySqlCommand("select * from colaborador where CPF = @CPFC");
cmd.Parameters.Add(new MySqlParameter("CPFC", cpf));

MySqlDataReader leia = c.Pesquisar(cmd);
if(leia.Read()) {
    leia.close();
    // DO YOUR OPERATIONS HERE
}
else {
    leia.close();
    // DO YOUR OPERATIONS HERE
}

【讨论】:

  • 如果它是一个有效的答案,然后接受它。它将帮助其他人决定作为解决方案
【解决方案2】:

必须手动关闭连接很容易出错。

消除忘记关闭资源的可能性是用using块实现数据库操作。

您可以阅读文档here,简而言之,一旦我们超出其范围,using 块将为您处理资源。

public void Importar()
{
    StreamReader leitor = new StreamReader(txtNome.Text);
    String linha = String.Empty;

    while (!leitor.EndOfStream)
    {
        linha = leitor.ReadLine();

        String[] dados = linha.Split(';');
        string nome = dados[0];
        string cpf = dados[1];
        string idunidade = dados[2];


        using(Conexao c = new Conexao())
        {
            c.Abrir();
            using(MySqlCommand cmd = new MySqlCommand("select * from colaborador where CPF = @CPFC"))
            {
                cmd.Parameters.Add(new MySqlParameter("@CPFC", cpf));
                using(MySqlDataReader leia = c.Pesquisar(cmd))
                {
                    if (leia.Read())
                    {
                        using(MySqlCommand updateCmd = new MySqlCommand("update colaborador set Nome = @NomeC, idUnidade = @idUnidadeC where CPF = @CPFC"))
                        {
                            updateCmd.Parameters.Add(new MySqlParameter("@NomeC", nome));
                            updateCmd.Parameters.Add(new MySqlParameter("@idUnidadeC", idunidade));
                            updateCmd.Parameters.Add(new MySqlParameter("@CPFC", cpf));
                            c.Executar(updateCmd);                   
                        }
                        else
                        {                    
                            using(MySqlCommand insertCmd = new MySqlCommand("insert into colaborador values (default, @NomeC, @CPFC, @idUnidadeC"))
                            {
                                insertCmd.Parameters.Add(new MySqlParameter("@NomeC", nome));
                                insertCmd.Parameters.Add(new MySqlParameter("@idUnidadeC", idunidade));
                                insertCmd.Parameters.Add(new MySqlParameter("@CPFC", cpf));
                                c.Executar(insertCmd);
                            }
                        }
                    }
                }                
            }
        }
    }
}

如您所见,代码结构更好,显示意图,最重要的是我不需要担心关闭每个连接。

请注意,您的 SQL 参数有一些错误(我已修复它们)。您将它们与@ 符号一起使用,但在没有它的情况下声明它们。

因此,在尝试执行命令时的第一个 if 块中 - 查询中的 @CPFC 未定义,因为您已将参数声明为 CPFC。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多