Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Clauido José

Atualizando tabela com mysql

Recommended Posts

Galera to aqui de novo com um problema quando vou atualizar ou deletar algum registro no banco de dados ele da a seguinte mensagem.

 

 

There is already an open DataReader associated with this Connection which must be closed first. em MySql.Data.MySqlClient.MySqlCommand.CheckState() em MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)

 

Como posso fazer a seguinte consulta não sei se assim que seria feito em c# mas faço isso no asp classico direto e sempre funciono blz.

 string MySqlConnString = "Data Source=127.0.0.1;Database=carsystem;User Id=root;Password=root;port=3306";
        using (MySqlConnection con = new MySqlConnection(MySqlConnString))
        {
            int idempresa = Convert.ToInt32(ClienteGridView.DataKeys[e.RowIndex].Value.ToString());
            string SQL = "SELECT * FROM tempresa where idempresa=" + idempresa;
            MySqlCommand cmd = new MySqlCommand(SQL, con);
            con.Open();
            if (con.State == ConnectionState.Open)
            {

                string sqlConsulta = "SELECT * FROM tempresa where titulo = @titulo";

                MySqlCommand cmdConsulta = new MySqlCommand(sqlConsulta, con);

                MySqlDataReader rdr = cmd.ExecuteReader();
                if (rdr.Read())
                {

                    int id = Convert.ToInt32(ClienteGridView.DataKeys[e.RowIndex].Value.ToString());
                    //Obtem o valor do TextBox no EditItemTemplet da linha clicada
                    string titulo = ((TextBox)ClienteGridView.Rows[e.RowIndex].FindControl("titulo")).Text;
                    string breve = ((TextBox)ClienteGridView.Rows[e.RowIndex].FindControl("breve")).Text;
                    string descricao = ((TextBox)ClienteGridView.Rows[e.RowIndex].FindControl("descricao")).Text;
                    string data_cadastro = ((TextBox)ClienteGridView.Rows[e.RowIndex].FindControl("data_cadastro")).Text;
                    string sqlConn = " UPDATE tempresa SET (titulo='" + titulo + "',breve='" + breve + "',descricao='" + descricao + "',data_cadastro='" + data_cadastro + "') where idempresa=" + id;
                    MySqlCommand cmd1 = new MySqlCommand(sqlConn, con);
                    try
                    {
                        cmd1.CommandText = sqlConn;
                        cmd1.ExecuteReader();
                        //nenhuma linha no modo de edição
                        ClienteGridView.EditIndex = -1;
                        //preenche o grid nomvanete
                        preencheGrid();
                        lblStatus.Text = "Registro atualizado com sucesso";
                    }
                    catch (Exception ex)
                    {
                        lblStatus.Text = (ex.ToString());
                    }
                    finally
                    {
                        rdr.Close();
                        con.Close();
                    }
                }
                else
                {

                }
            }
        }

Compartilhar este post


Link para o post
Compartilhar em outros sites

a propósito, nessa sql de atualização:

 

UPDATE tempresa SET (titulo='" + titulo + "',breve='" + breve + "',descricao='" + descricao (...)

 

faz 1 bom tempo q não mexo c/ Asp.net, mas se não estou enganado,

o Mysql não aceita esse operador ("+").... como concatenação de strings..
qqer coisa, verifique...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ele nao cai na finally e sim no catch quando vou debugar na linha do cmd1.ExecuteReader() ele pula pro catch e da essa mensagem de erro ele nao executa

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas independentemente do catch, o finally deveria ser chamado em qualquer caso. A menos que um retorno seja definido. O seu problema é que o dataReader ainda está aberto quando ele executa a query, você vai precisar fechar ele logo em seguida, ao invés de fechar no finally, experimente colocar ele diretamente no try.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Doctor consegui passou fechando o reader.Close(); cmd.Dispose(); só que esta dando um erro na query como transformar a data pra gravar no mysql dd/mm/yyyy

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está utilizando a mesma conexão para o dataReader e para o Upate/Delete, acho que isso não pode. Cada comando precisa de sua conexão.

 

Sugiro que crie uma função de deletar/atualizar, lá, você cria as conexões e tudo mais, só ai você chama ela no seu datareader. Isso vai ajudar muito, alem de deixar o código mais legível na hora de uma futura atualização.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@brissolare

 

Quanto a conexão, não há problemas em criar uma unica para todos os comandos. Isso, na verdade, é considerado uma boa prática porque poupa espaço de memória, realmente o código fica mais legível com a criação de diversas conexões, porém não fica leve para o carregamento. Por isso aconselho um objeto principal que é estendido por todas as classes do sistema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara consegui resolver essa veja como fico o codigo.

    protected void butGravar_Click(object sender, EventArgs e)
    {
        string SQL = "SELECT * FROM tempresa where titulo = @titulo";
        MySqlCommand cmd = new MySqlCommand(SQL, con);
        cmd.Parameters.Add("@titulo", MySqlDbType.VarChar).Value = txtempresa.Text;

        try
        {
            con.Open();
            if (con.State == ConnectionState.Open) 
            {
                reader = cmd.ExecuteReader();
                if (reader.Read())
                {
                    lblStatus.Text = "Empresa ja cadadastrada em nosso sistema !!";
                }else{
                    try
                    {
                        reader.Close();
                        cmd.Dispose();
                        //Obtem o valor do TextBox no EditItemTemplet da linha clicada
                        string titulo = txtempresa.Text;
                        string breve = txtBreve.Text;
                        string descricao = ckDescricao.Text;
                        DateTime data = Convert.ToDateTime(txtData.Text);
                        string data_cadastro = data.ToString("yyyy/mm/dd"); 
                        string sqlConn = "INSERT INTO tempresa (titulo,breve,descricao,data_cadastro) values  ('";
                        sqlConn += titulo + "','" + breve + "','" + descricao.Replace('/', ',') + "','" + data_cadastro + "')";
                        cmd.CommandText = sqlConn;
                        cmd.ExecuteReader();
                        lblStatus.Text = "Empresa Cadastrada com sucesos";

                        con.Close();
                    }catch (Exception ex){
                        lblStatus.Text = (ex.ToString());
                    }
                }
            }
        }
        catch (Exception ex)
        {
                lblStatus.Text = (ex.ToString());
        }

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.