none
erro ao localizar o dado no banco RRS feed

Respostas

  • Bom dia amigo, o problema é que o finally sempre será acessado, independente se ocorreu algum erro ou não. Normalmente é usado quando você precisa destruir um objeto mesmo que ocorra um erro, como por exemplo executar um procedimento que encerra uma conexão com o banco. Esta faltando algumas coisas no restante do código também, o comando na verdade não esta sendo executado, um exemplo:

    // Update the demographics for a store, which is stored 
        // in an xml column. 
        string commandText = "UPDATE Sales.Store SET Demographics = @demographics "
            + "WHERE CustomerID = @ID;";
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            SqlCommand command = new SqlCommand(commandText, connection);
            command.Parameters.Add("@ID", SqlDbType.Int);
            command.Parameters["@ID"].Value = customerID;
            // Use AddWithValue to assign Demographics.
            // SQL Server will implicitly convert strings into XML.
            command.Parameters.AddWithValue("@demographics", demoXml);
            try
            {
                connection.Open();
                Int32 rowsAffected = command.ExecuteNonQuery();
                Console.WriteLine("RowsAffected: {0}", rowsAffected);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }

    http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters.aspx

    Você pode até manter o finally para fechar sua conexão, mas o correto é utilizar o catch para capturar possíveis exceções:

    try
    {
       connection.Open();
       //codigo da query
       command.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
       MessageBox.Show("Erro");
    }
    finally
    {
       connection.Close();
    }

    Neste caso sim, se ocorrer um erro irá entra no catch e exibir a mensagem pro usuário, mas sempre irá executar o connection.Close(), para evitar que a conexão fique aberta.


    Rodrigo Reis Ferreira
    Microsoft Certified


    sexta-feira, 20 de abril de 2012 12:23
  • Olá,

    Apenas para complementar a resposta do Rodrigo, é muito importante guardar todas as informações do erro num log para que consiga entender o que aconteceu quando precisar dar suporte à essa aplicação. Apenas "esconder" o erro e dizer para o usuário que houve um problema não resolve...

    try
    {
        // ..
    }
    catch (Exception ex)
    {
        logger.WriteLine(ex); // Ou algo semelhante...
    
        // ..
    }
    finally
    {
        // ..
    }


    Abraços,
    Caio Proiete



    Caio Proiete
    Microsoft MVP, MCT, MCPD, MCTS, MCSD
    http://caioproiete.net
    • Marcado como Resposta fgoliveira domingo, 22 de abril de 2012 21:36
    sexta-feira, 20 de abril de 2012 13:48
    Moderador
  • ótima dica, no meu caso possuo uma dll que faz a captura de erros não tratado também e envia via web service para o banco. Pode usar o Enterprise Libray para fazer o log dessas exceções. :). E como disse o Caio, o feedback pro usuário é importante, esconda a mensagem de exceção e exiba pra ele uma mensagem mais amigável, informando de forma resumida o ocorrido e como resolve-lo.

    Rodrigo Reis Ferreira
    Microsoft Certified

    • Marcado como Resposta fgoliveira domingo, 22 de abril de 2012 21:36
    sexta-feira, 20 de abril de 2012 18:31
  • Valeu senhores, masi foi solucionado, olha aonde eu queria chegar...

     private void btnProcurar_Click(object sender, EventArgs e)
            {
                try
                {
                    SqlDataReader dr;
                    string sql = "select * From Cliente Where idNome=@idNome";
                    SqlCommand cmm = new SqlCommand(sql, cnn);
                    cmm.Parameters.AddWithValue("@idNome", txtCodigo.Text);
                    cnn.Open();
                    dr = cmm.ExecuteReader();
                    while (dr.Read())
                    {
                        txtNome.Text = dr[1].ToString();
                        mktCpf.Text = dr[2].ToString();
                        mktTelefone.Text = dr[3].ToString();

                    }
                    cnn.Dispose();
                                   

                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }


    Fernando Gomes

    • Marcado como Resposta fgoliveira terça-feira, 24 de abril de 2012 17:35
    terça-feira, 24 de abril de 2012 17:34

Todas as Respostas

  • Ahhhhhh, e está cadastrado este codigo de cliente, no banco!!!


    Fernando Gomes

    sexta-feira, 20 de abril de 2012 02:04
  • Bom dia amigo, o problema é que o finally sempre será acessado, independente se ocorreu algum erro ou não. Normalmente é usado quando você precisa destruir um objeto mesmo que ocorra um erro, como por exemplo executar um procedimento que encerra uma conexão com o banco. Esta faltando algumas coisas no restante do código também, o comando na verdade não esta sendo executado, um exemplo:

    // Update the demographics for a store, which is stored 
        // in an xml column. 
        string commandText = "UPDATE Sales.Store SET Demographics = @demographics "
            + "WHERE CustomerID = @ID;";
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            SqlCommand command = new SqlCommand(commandText, connection);
            command.Parameters.Add("@ID", SqlDbType.Int);
            command.Parameters["@ID"].Value = customerID;
            // Use AddWithValue to assign Demographics.
            // SQL Server will implicitly convert strings into XML.
            command.Parameters.AddWithValue("@demographics", demoXml);
            try
            {
                connection.Open();
                Int32 rowsAffected = command.ExecuteNonQuery();
                Console.WriteLine("RowsAffected: {0}", rowsAffected);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }

    http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters.aspx

    Você pode até manter o finally para fechar sua conexão, mas o correto é utilizar o catch para capturar possíveis exceções:

    try
    {
       connection.Open();
       //codigo da query
       command.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
       MessageBox.Show("Erro");
    }
    finally
    {
       connection.Close();
    }

    Neste caso sim, se ocorrer um erro irá entra no catch e exibir a mensagem pro usuário, mas sempre irá executar o connection.Close(), para evitar que a conexão fique aberta.


    Rodrigo Reis Ferreira
    Microsoft Certified


    sexta-feira, 20 de abril de 2012 12:23
  • Olá,

    Apenas para complementar a resposta do Rodrigo, é muito importante guardar todas as informações do erro num log para que consiga entender o que aconteceu quando precisar dar suporte à essa aplicação. Apenas "esconder" o erro e dizer para o usuário que houve um problema não resolve...

    try
    {
        // ..
    }
    catch (Exception ex)
    {
        logger.WriteLine(ex); // Ou algo semelhante...
    
        // ..
    }
    finally
    {
        // ..
    }


    Abraços,
    Caio Proiete



    Caio Proiete
    Microsoft MVP, MCT, MCPD, MCTS, MCSD
    http://caioproiete.net
    • Marcado como Resposta fgoliveira domingo, 22 de abril de 2012 21:36
    sexta-feira, 20 de abril de 2012 13:48
    Moderador
  • ótima dica, no meu caso possuo uma dll que faz a captura de erros não tratado também e envia via web service para o banco. Pode usar o Enterprise Libray para fazer o log dessas exceções. :). E como disse o Caio, o feedback pro usuário é importante, esconda a mensagem de exceção e exiba pra ele uma mensagem mais amigável, informando de forma resumida o ocorrido e como resolve-lo.

    Rodrigo Reis Ferreira
    Microsoft Certified

    • Marcado como Resposta fgoliveira domingo, 22 de abril de 2012 21:36
    sexta-feira, 20 de abril de 2012 18:31
  • Valeu senhores, masi foi solucionado, olha aonde eu queria chegar...

     private void btnProcurar_Click(object sender, EventArgs e)
            {
                try
                {
                    SqlDataReader dr;
                    string sql = "select * From Cliente Where idNome=@idNome";
                    SqlCommand cmm = new SqlCommand(sql, cnn);
                    cmm.Parameters.AddWithValue("@idNome", txtCodigo.Text);
                    cnn.Open();
                    dr = cmm.ExecuteReader();
                    while (dr.Read())
                    {
                        txtNome.Text = dr[1].ToString();
                        mktCpf.Text = dr[2].ToString();
                        mktTelefone.Text = dr[3].ToString();

                    }
                    cnn.Dispose();
                                   

                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }


    Fernando Gomes

    • Marcado como Resposta fgoliveira terça-feira, 24 de abril de 2012 17:35
    terça-feira, 24 de abril de 2012 17:34
  • beleza Fernando. lembra de colocar o finally pra dar um Close na conexão, senão se ocorrer uma exceção a sua conexão vai ficar aberta e pode causar problemas. :)

    abraços


    Rodrigo Reis Ferreira
    Microsoft Certified

    terça-feira, 24 de abril de 2012 18:41
  • Valeu Rodrigo, vai me ajudando ae cara, sou novato ainda cara...rsrsrsrs

    abraços


    Fernando Gomes

    terça-feira, 24 de abril de 2012 20:43