none
Funções C# RRS feed

  • Pergunta

  • Olá,

    Estou fazendo uma aplicação c# que involve um form de login, e tenho uma parte do código que é repetida várias vezes ao longo do código. Gostava de saber como posso criar uma função para escrever esse código apenas uma vez e depois ser chamado em outros eventos.

    O código é o seguinte:

                    

    public partial class Form1 : Form
        {
            //LIGAÇÃO COM A BD
            MySqlConnection mConn = new MySqlConnection("server=localhost;database=escola;uid=root");
            MySqlDataAdapter mAdaptar;
            DataSet mDataSet;
            DataTable table = new DataTable();



            public Form1()
            {
                InitializeComponent();
            }



            //BOTAO LOGIN
            private void login_Click(object sender, EventArgs e)
            {   //ESTE É O CODIGO QUE QUERO USAR NA FUNCAO

                mAdaptar = new MySqlDataAdapter("SELECT `N_Processo`, `senha` FROM `dadoslogin` WHERE `N_Processo` = '" + user.Text + "' AND `senha` = '" + pass.Text + "'", mConn);
                mAdaptar.Fill(table);

                if (table.Rows.Count <= 0)
                {
                    //MENSAGEM ERRO
                    painel_msg.Visible = true;
                    painel_msg.BackColor= Color.Red;
                    painel_msg.Height = 0;
                    erro.Text = "Utilizador ou Senha Incorretos";
                    timer1.Start();
                }

                else
                {
                    //MENSAGEM SUCESSO
                    painel_msg.Visible = true;
                    painel_msg.BackColor = Color.Green;
                    painel_msg.Height = 0;
                    painel_sair.Height = 0;
                    erro.Text = "Login efetuado com sucesso";
                    timer2.Start();
                } 

                table.Clear();
            }

    sábado, 1 de dezembro de 2018 11:02

Respostas

  • Olá RodrigoMAD,

    Uma das boas práticas é você criar uma classe só responsável para se comunicar com teu banco e executar as operações CRUD. Como você pediu te posto um modelo da classe responsável só com teu banco e o método que usa Adapter retornando uma DataTable, você pode estender esta classe com demais operações da CRUD.

    public class AccessDataBase : IDisposable
        {
            private readonly MySqlConnection mConn;

            public AccessDataBase()
            {
                try
                {
                    
                    mConn = new MySqlConnection("server=localhost;database=escola;uid=root");;
                    mConn.Open();
                }
                catch (Exception ex)
                {

                    MessageBox.Show(ex.Message.ToString());
                }
            }

            public DataTable ExecutarComandoAdapter(string sqlQuery)
            {
                
                var adaptador = new MySqlDataAdapter(sqlQuery, mConn);
                var dados = new DataTable();

                adaptador.Fill(dados);

                return dados;
            }

            public void Dispose()
            {
                if (mConn.State == ConnectionState.Open)
                    mConn.Close();
            }
        }

    Usando o teu exemplo, o codigo fica refatorado do seguinte:

    public partial class Form1 : Form
        {
            
    AccessDataBase accessDb;
            DataTable table = new DataTable();



            public Form1()
            {
                InitializeComponent();
            }



            //BOTAO LOGIN
            private void login_Click(object sender, EventArgs e)
            {   //ESTE É O CODIGO QUE QUERO USAR NA FUNCAO
        
                accessDb = new AccessDataBase();
                var query = "SELECT `N_Processo`, `senha` FROM `dadoslogin` WHERE `N_Processo` = '" + user.Text + "' AND `senha` = '" + pass.Text + "'";
                table = accessDb.ExecutarComandoAdapter(query);

                if (table.Rows.Count <= 0)
                {
                    //MENSAGEM ERRO
                    painel_msg.Visible = true;
                    painel_msg.BackColor= Color.Red;
                    painel_msg.Height = 0;
                    erro.Text = "Utilizador ou Senha Incorretos";
                    timer1.Start();
                }

                else
                {
                    //MENSAGEM SUCESSO
                    painel_msg.Visible = true;
                    painel_msg.BackColor = Color.Green;
                    painel_msg.Height = 0;
                    painel_sair.Height = 0;
                    erro.Text = "Login efetuado com sucesso";
                    timer2.Start();
                } 

                table.Clear();
            }

    Se te ajudou vota como útil, e se respondeu a tua pergunta marque como resposta.

    sábado, 1 de dezembro de 2018 17:12
  • Boa tarde,

    Por falta de retorno essa thread está encerrada.

    Se necessário favor abrir uma nova thread.

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 18 de janeiro de 2019 18:49
    Moderador

Todas as Respostas

  • Olá RodrigoMAD,

    Uma das boas práticas é você criar uma classe só responsável para se comunicar com teu banco e executar as operações CRUD. Como você pediu te posto um modelo da classe responsável só com teu banco e o método que usa Adapter retornando uma DataTable, você pode estender esta classe com demais operações da CRUD.

    public class AccessDataBase : IDisposable
        {
            private readonly MySqlConnection mConn;

            public AccessDataBase()
            {
                try
                {
                    
                    mConn = new MySqlConnection("server=localhost;database=escola;uid=root");;
                    mConn.Open();
                }
                catch (Exception ex)
                {

                    MessageBox.Show(ex.Message.ToString());
                }
            }

            public DataTable ExecutarComandoAdapter(string sqlQuery)
            {
                
                var adaptador = new MySqlDataAdapter(sqlQuery, mConn);
                var dados = new DataTable();

                adaptador.Fill(dados);

                return dados;
            }

            public void Dispose()
            {
                if (mConn.State == ConnectionState.Open)
                    mConn.Close();
            }
        }

    Usando o teu exemplo, o codigo fica refatorado do seguinte:

    public partial class Form1 : Form
        {
            
    AccessDataBase accessDb;
            DataTable table = new DataTable();



            public Form1()
            {
                InitializeComponent();
            }



            //BOTAO LOGIN
            private void login_Click(object sender, EventArgs e)
            {   //ESTE É O CODIGO QUE QUERO USAR NA FUNCAO
        
                accessDb = new AccessDataBase();
                var query = "SELECT `N_Processo`, `senha` FROM `dadoslogin` WHERE `N_Processo` = '" + user.Text + "' AND `senha` = '" + pass.Text + "'";
                table = accessDb.ExecutarComandoAdapter(query);

                if (table.Rows.Count <= 0)
                {
                    //MENSAGEM ERRO
                    painel_msg.Visible = true;
                    painel_msg.BackColor= Color.Red;
                    painel_msg.Height = 0;
                    erro.Text = "Utilizador ou Senha Incorretos";
                    timer1.Start();
                }

                else
                {
                    //MENSAGEM SUCESSO
                    painel_msg.Visible = true;
                    painel_msg.BackColor = Color.Green;
                    painel_msg.Height = 0;
                    painel_sair.Height = 0;
                    erro.Text = "Login efetuado com sucesso";
                    timer2.Start();
                } 

                table.Clear();
            }

    Se te ajudou vota como útil, e se respondeu a tua pergunta marque como resposta.

    sábado, 1 de dezembro de 2018 17:12
  • Boa tarde,

    Por falta de retorno essa thread está encerrada.

    Se necessário favor abrir uma nova thread.

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 18 de janeiro de 2019 18:49
    Moderador