none
Enviar dados do Timer para o MySql RRS feed

  • Pergunta

  • Olá pessoal, sou novo no ramo da programação e estou aprendendo aos poucos a linguagem ... mas enfim, estou com um problema de inserção de dados, do Timer para o MySQL, vou explicar a situação:

    Tenho um timer que irá informar na tela do usuário o dia e a hora:

    private void timer1_Tick(object sender, EventArgs e)
            {
                DateTime dia_hora = DateTime.Now;
               
                lblData.Text =  dia_hora.ToShortDateString();
                lblHora.Text =  dia_hora.ToShortTimeString();
            }

    Tenho um button CONSULTA que tem como função encontrar o funcionário no banco de dados e exibir o nome dele na tela (a forma de busca é feita através do RE do funcionário (numero que ele recebe ao entrar na empresa).

    E eu tenho o button ACESSAR que apos o usuário se achar no sistema pelo seu RE, ele acessará outro form para o funcionário realizar sua atividade no momento, porem eu quero gravar o momento que ele chamou o outro form com o dia, mês, ano e a hora, minuto e segundo, e apos ele finalizar a atividade gravar a sua saída, porem estou tendo problema na hora de gravar esses dados no MySQL, no button Acessar fiz inserção dos dados das lbl que estão recebendo os dados de data e hora do timer, está acessando, porem não está gravando.

    Queria saber como eu posso fazer esse procedimento, eu pensei em parar a contagem do Timer e pegar o numero que ele parou, porem não tive exito, alguém teria uma ideia de como eu posso fazer isso?

    Agradeço desde já.

    sexta-feira, 22 de março de 2019 16:12

Respostas

  • Acabei conseguindo efetuar o procedimento, obrigado pela ajuda.

    DateTime tempo = DateTime.Now;

                    string iQuery = "insert into tempo(idtempo, temp_entrada) values('" + this.txtRE.Text + "','" + tempo.ToString("yyyy-MM-dd HH:mm:ss") + "')";
                    MySqlCommand cmd = new MySqlCommand(iQuery, conn);
                    int registrosAlterados;
                    txtRE.Clear();
                    txtUser.Clear();

                try
                {
                    conn.Open();
                    registrosAlterados = cmd.ExecuteNonQuery();

                if (registrosAlterados > 0)
                {
                    this.Visible = false;
                    Refile1 refile = new Refile1();
                    refile.ShowDialog();
                    this.Visible = true;
                }
                 }
                catch (Exception ex)
                {
                    MessageBox.Show($"Erro favor informar o administrador\nError Message: {ex.Message}\nStackTrace: {ex.StackTrace}");
                }
                finally
                {
                    conn.Close();
                }

                                            
    • Marcado como Resposta Gabriel Pina sexta-feira, 3 de maio de 2019 14:07
    sexta-feira, 3 de maio de 2019 14:07

Todas as Respostas

  • Olá, Gabriel!

    Não entendi bem a sua dúvida. Você está com dificuldades para gravar a hora/data na hora em que o outro form é chamado ou na hora em que o usuário finaliza sua atividade? Ou não está conseguindo gravar os dados no banco em nenhum momento? 

    Poderia colocar o código do botão Acessar?


    “First do it, then do it right, then do it better.” - Addy Osmani

    sexta-feira, 22 de março de 2019 20:29
  • Olá, Wallace!

    Acabei escrevendo muito e não dizendo nada, perdão.

    Então o que eu preciso fazer é, no momento que o usuário pressionar o Button Acessar, o Button grave no banco de dados o dia e hora que foi chamado o outro Form no nome do usuário que foi buscado pelo Button Consultar.

    Porem não estou conseguindo gravar os dados no banco de dados, vi varios videos no YouTube explicando como usa o Timer, porem não consegui fazer ... Usei o TRY, ou ele caia no CATCH ou ele ia pro outro form sem gravar no banco de dados 

    Tentei colocar uma imagem pra melhorar a visualização, porém dava erro.



    • Editado Gabriel Pina quarta-feira, 27 de março de 2019 14:13 .
    quarta-feira, 27 de março de 2019 12:52
  • Bem, vamos por partes. Em qual tabela serão gravados os dados? Pode colocar essa parte do código para eu ver?

    A lógica é simples: ao clicar no botão, o método executa a gravação e abre o outro form, certo?


    “First do it, then do it right, then do it better.” - Addy Osmani

    quarta-feira, 27 de março de 2019 15:45
  • Boa tarde Wallace,

    Segue o codigo que foi feito no Button Acessar, ele está caindo direto no CATCH.

    private void bttAcess_Click(object sender, EventArgs e)
            {
                try
                {
                    timer1.Enabled = false;
                    conn.Open();
                    MySqlCommand comand = conn.CreateCommand();
                    comand.CommandType = CommandType.Text;
                    comand.CommandText = "insert into login(data_entrada, hora_entrada) values('" + lblDataRecebe.Text + "','" + lblHoraRecebe.Text + "')";
                    comand.ExecuteNonQuery();
                    this.Visible = false;
                    Operacao operar = new Operacao();
                    operar.ShowDialog();
                    this.Visible = true;
                }
                catch (Exception)
                {
                    MessageBox.Show("Erro favor informar o administrador");
                }
                finally
                {
                    timer1.Enabled = true;
                    conn.Close();
                }
            }
    • Editado Gabriel Pina quarta-feira, 27 de março de 2019 17:00
    quarta-feira, 27 de março de 2019 16:21
  • Pode colocar o erro que está sendo mostrado? Coloque o seguinte trecho assim:

    catch (Exception ex)
    {
       MessageBox.Show($"Erro favor informar o administrador\nError Message: {ex.Message}\nStackTrace: {ex.StackTrace}");
    }

    Assim será mostrado o tipo do erro que está acontecendo e também o StackTrace para sabermos a linha do erro!

    Uma coisa: para capturar a data de acesso, poderia usar a data atual do sistema, não? Por exemplo:

    comand.CommandText = $"INSERT INTO LOGIN (DATA_ENTRADA,  HORA_ENTRADA) VALUES ({DateTime.Now.Date}, {DateTime.Now.TimeOfDay})";
    A data e a hora de entrada ficam relacionadas ao usuário que acessou? Como se fosse um log?


    “First do it, then do it right, then do it better.” - Addy Osmani

    quarta-feira, 27 de março de 2019 17:42
  • Sim, eu também tentei gravar a hora do sistema no software, porém obtive exito e não usei dessa forma kkk ...

    E sim, seria como se fosse um log, porém para o fácil acesso do usuário, ele só teria que por a numeração dele (por exemplo, um CPF) se achar no sistema pelo button Consultar e através do button Acessar gravar o horário que o funcionário entrou no sistema.

    como a minha conta é nova, eles não permitem o que eu insira imagem ou link ... segue abaixo a mensagem do erro que apareceu apos o clique no button Acessar.

    Error Message: You Have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '00:00:00, 8:29:58.731500)' at line 1

    Stack Trace: em MySql.Data.MySqlClient.MySqlStream.ReadPacket()

    em MySql.Data.MySqlNativeDriver.GetResult(Int32& affectRow, Int64 & insertedId)

    em MySql.Data.MySqlCliente.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int64& insertedId)

    em MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Boolean force)

    em MySql.Data.MySqlClient..MySqlDataReader.NextResult()

    em

    MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)

    em MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() em Paranoa.Login.bttAcess_Click(Objetc sender, Event Args e) na C:\Users\gpina\Desktop\C#\Setup\Teste\Login.cs:linha 106

    quinta-feira, 28 de março de 2019 12:09
  • O erro está acontecendo na sua SQL. As colunas data e hora são de que tipo? Varchar?

    “First do it, then do it right, then do it better.” - Addy Osmani

    quinta-feira, 28 de março de 2019 12:47
  • Bom dia Wallace,

    Então, eu deixei ambas as colunas em timestamp.

    quinta-feira, 28 de março de 2019 12:51
  • Faca um teste usando varchar, por exemplo, e veja se funciona. Pode ser algum tipo de inconsistência no formato dos dados que estamos passando para o banco de dados.


    “First do it, then do it right, then do it better.” - Addy Osmani


    quinta-feira, 28 de março de 2019 13:04
  • Ajustei o banco de dados, colocando o data_entrada e o hora_entrada como varchar, não apresentou erro, porem não inseriu os dados.

    O codigo do button ficou:


            private void bttAcess_Click(object sender, EventArgs e)
            {
                try
                {
                    conn.Open();
                    MySqlCommand comand = conn.CreateCommand();
                    comand.CommandType = CommandType.Text;
                    comand.CommandText = $"INSERT INTO LOGIN (DATA_ENTRADA,  HORA_ENTRADA) VALUES ({DateTime.Now.Date}, {DateTime.Now.TimeOfDay})";
                    this.Visible = false;
                    Operacao operar = new Operacao();
                    operar.ShowDialog();
                    this.Visible = true;
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Erro favor informar o administrador\nError Message: {ex.Message}\nStackTrace: {ex.StackTrace}");
                }
                finally
                {
                    conn.Close();
                }
            }

    • Editado Gabriel Pina quinta-feira, 28 de março de 2019 13:25
    quinta-feira, 28 de março de 2019 13:24
  • Adicione essas aspas e tente novamente:

    comand.CommandText = $"INSERT INTO LOGIN (DATA_ENTRADA,  HORA_ENTRADA) VALUES ('{DateTime.Now.Date}', '{DateTime.Now.TimeOfDay}')";


    “First do it, then do it right, then do it better.” - Addy Osmani

    quinta-feira, 28 de março de 2019 14:48
  • Acrescentei a aspa, no entanto o comand para insert não foi para o banco de dados ... estive pensando, não teria que colocar comando de busca para inserir o dado na tabela?
    quinta-feira, 28 de março de 2019 16:25
  • Na verdade, está faltando uma linnha de código, a de executar a query!

    private void bttAcess_Click(object sender, EventArgs e)
            {
                try
                {
                    conn.Open();
                    MySqlCommand comand = conn.CreateCommand();
                    comand.CommandType = CommandType.Text;
                    comand.CommandText = $"INSERT INTO LOGIN (DATA_ENTRADA,  HORA_ENTRADA) VALUES ('{DateTime.Now.Date}', '{DateTime.Now.TimeOfDay}')";

                    command.ExecuteNonQuery();
                    this.Visible = false;
                    Operacao operar = new Operacao();
                    operar.ShowDialog();
                    this.Visible = true;
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"Erro favor informar o administrador\nError Message: {ex.Message}\nStackTrace: {ex.StackTrace}");
                }
                finally
                {
                    conn.Close();
                }
            }


    “First do it, then do it right, then do it better.” - Addy Osmani

    quinta-feira, 28 de março de 2019 18:22
  • Seria interessante você trocar {DateTime.Now.ShortDateString()}', '{DateTime.Now.LongTimeString()}
    quinta-feira, 28 de março de 2019 21:26
  • Boa tarde.

    Desculpa não ter respondido, acabei me ocupando com outros procedimentos e estou retomando agora.

    Então botei pra rodar com as alterações propostas, no entanto não obtive exito.

    quarta-feira, 17 de abril de 2019 17:29
  • Acabei conseguindo efetuar o procedimento, obrigado pela ajuda.

    DateTime tempo = DateTime.Now;

                    string iQuery = "insert into tempo(idtempo, temp_entrada) values('" + this.txtRE.Text + "','" + tempo.ToString("yyyy-MM-dd HH:mm:ss") + "')";
                    MySqlCommand cmd = new MySqlCommand(iQuery, conn);
                    int registrosAlterados;
                    txtRE.Clear();
                    txtUser.Clear();

                try
                {
                    conn.Open();
                    registrosAlterados = cmd.ExecuteNonQuery();

                if (registrosAlterados > 0)
                {
                    this.Visible = false;
                    Refile1 refile = new Refile1();
                    refile.ShowDialog();
                    this.Visible = true;
                }
                 }
                catch (Exception ex)
                {
                    MessageBox.Show($"Erro favor informar o administrador\nError Message: {ex.Message}\nStackTrace: {ex.StackTrace}");
                }
                finally
                {
                    conn.Close();
                }

                                            
    • Marcado como Resposta Gabriel Pina sexta-feira, 3 de maio de 2019 14:07
    sexta-feira, 3 de maio de 2019 14:07