none
Falha na DateTime RRS feed

  • Pergunta

  • Tenho que terminar esse trabalho para faculdade e só falta o sistema reconhecer a data de vencimento deste cadastro, mas está dando este erro.

    Esse é o modelo:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace CamadaModelo
    {
        public class mdlAtarefador
        {
            public int Codigo { get; set; }
            public string Tarefa { get; set; }
            public string Disciplina { get; set; }
            public DateTime Termino { get; set; }
        }
    }

    Esse é o Controle:

    using CamadaModelo;
    using System.Data;
    using System.Configuration;

    namespace CamadaControle
    {
        public class ctlAtarefador
        {
            public bool Cadastrar(mdlAtarefador _mdlAtarefador)
            {
                try
                {
                    string conexaoAccess = ConfigurationManager.ConnectionStrings["conexaoAccess"].ToString();
                    OleDbConnection conexaodb = new OleDbConnection(conexaoAccess);
                    conexaodb.Open();

                    string query = "INSERT INTO tblAtarefador (Tarefa, Disciplina, Termino) VALUES (@Tarefa, @Disciplina, @Termino)";
                    OleDbCommand cmd = new OleDbCommand(query, conexaodb);

                    var pmtTarefa = cmd.CreateParameter();
                    pmtTarefa.ParameterName = "@Tarefa";
                    pmtTarefa.DbType = DbType.String;
                    pmtTarefa.Value = _mdlAtarefador.Tarefa;
                    cmd.Parameters.Add(pmtTarefa);

                    var pmtDisciplina = cmd.CreateParameter();
                    pmtDisciplina.ParameterName = "@Disciplina";
                    pmtDisciplina.DbType = DbType.String;
                    pmtDisciplina.Value = _mdlAtarefador.Disciplina;
                    cmd.Parameters.Add(pmtDisciplina);

                    var pmtTermino = cmd.CreateParameter();
                    pmtTermino.ParameterName = "@Termino";
                    pmtTermino.DbType = DbType.DateTime;
                    pmtTermino.Value = _mdlAtarefador.Termino;
                    cmd.Parameters.Add(pmtTermino);

                    if (cmd.ExecuteNonQuery() > 0)
                    {
                        conexaodb.Close();
                        return true;
                    }
                    else
                    {
                        conexaodb.Close();
                        return false;
                    }
                }
                catch (Exception ex)
                {
                    throw;
                }
            }
        }
    }

    O erro se da no botão cadastrar, aqui o código

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using CamadaControle;
    using CamadaModelo;
    using System.Diagnostics;



    namespace Atarefador2012
    {
        public partial class Contact : Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
            }

            protected void btnCadastrar_Click(object sender, EventArgs e)
            {
                mdlAtarefador _mdlAtarefador = new mdlAtarefador();
                ctlAtarefador _ctlAtarefador = new ctlAtarefador();

                _mdlAtarefador.Tarefa = txtTarefa.Text;
                _mdlAtarefador.Disciplina = txtDisciplina.Text;
                _mdlAtarefador.Termino =  Convert.ToDateTime("0{MM/dd/yyyy}"); //Erro ocorre aqui, é a excessão

                bool retornoInsert = _ctlAtarefador.Cadastrar(_mdlAtarefador);

                if (retornoInsert == true)
                {
                    ScriptManager.RegisterStartupScript(this,
                                                        this.GetType(),
                                                        "sucesso",
                                                        "alert('Tarefa cadastrada com sucesso!');",
                                                        true);
                }
            }
        }
    }

    Aparece esse erro ao usar o botão cadastrar no compilador:

    [FormatException: Cadeia de caracteres não foi reconhecida como DateTime válido.]
       System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles) +12611706
       System.Convert.ToDateTime(String value) +83
       Atarefador2012.Contact.btnCadastrar_Click(Object sender, EventArgs e) in c:\Users\light\Desktop\Atarefador2012\Atarefador2012\Contact.aspx.cs:28
       System.Web.UI.WebControls.Button.OnClick(EventArgs e) +9767618
       System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +204
       System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +12
       System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +15
       System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +35
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1738

    sexta-feira, 17 de novembro de 2017 11:24

Respostas

  • Caso queira a data vindo de um label é só passar como paramêtro:

    _mdlAtarefador.Termino =  _mdlAtarefador.Termino = DateTime.ParseExact(txtDateTermino.Text, "MM/dd/yyyy", CultureInfo.InvariantCulture)

    onde txtDateTermino  é o seu label.

    • Sugerido como Resposta Felipeta sexta-feira, 17 de novembro de 2017 12:47
    • Marcado como Resposta Filipe B CastroModerator segunda-feira, 20 de novembro de 2017 12:36
    sexta-feira, 17 de novembro de 2017 12:29

Todas as Respostas

  • Aqui  Não irá funcionar pois não está passando nenhum valor válido para a função.

    Convert.ToDateTime("0{MM/dd/yyyy}")


    Tente utilizar a classe Date Time com o método ParseExact

     DateTime.ParseExact(_mdlAtarefador.Termino.toString(), "MM/dd/yyyy", CultureInfo.InvariantCulture)



    • Sugerido como Resposta Felipeta sexta-feira, 17 de novembro de 2017 11:48
    • Editado Felipeta sexta-feira, 17 de novembro de 2017 12:00
    • Não Sugerido como Resposta Felipeta sexta-feira, 17 de novembro de 2017 12:08
    sexta-feira, 17 de novembro de 2017 11:41
  • Não, eu queria converter o termino para DateTime e gravar no bando de dados.

    Mas o sistema não permitiu, e ao incluir esse 0 uma das exceções sumiu e ficou apenas "Cadeia de caracteres não reconhecida como DateTime válido"

    sexta-feira, 17 de novembro de 2017 11:46
  • Eu vou editar minha resposta acima.

    Se nesse construtor 

    mdlAtarefador _mdlAtarefador = new mdlAtarefador();

    você não atribui valor nenhum a propriedade 'Termino'  você não poderá usar como parâmetro.

    Então você terá que atribuir um valor para término , ou passar uma data como string para a função de conversão fazendo com o que a propiedade término receba o resultado da conversão.


     _mdlAtarefador.Termino = DateTime.ParseExact(_mdlAtarefador.Termino.toString(), "MM/dd/yyyy", CultureInfo.InvariantCulture)

     

    ou

     _mdlAtarefador.Termino = DateTime.ParseExact("12/25/2017", "MM/dd/yyyy", CultureInfo.InvariantCulture)

    Caso queira a data atual é so atribuir :

    _mdlAtarefador.Termino =  _mdlAtarefador.Termino = DateTime.Now 




    • Sugerido como Resposta Felipeta sexta-feira, 17 de novembro de 2017 12:08
    • Editado Felipeta sexta-feira, 17 de novembro de 2017 12:14
    sexta-feira, 17 de novembro de 2017 11:58
  • Eu quis armazenar um DateTime.

    Preciso para inlcuir no banco de dados.

    A modificação da classe DateTime eu declaro aonde?

    No Modelo ou no Controle?


    • Editado Niko9000 sexta-feira, 17 de novembro de 2017 12:08
    sexta-feira, 17 de novembro de 2017 12:07
  • Você não precisa modificar a classe date time. 

    Você pode fazer a alteração de uma das formas como foi apresentado na reposta.

    Você precisa verificar se o modelo do banco está como dateTime, se estiver, irá funcionar atribuindo um valor a propriedade término, como comentado acima.
    sexta-feira, 17 de novembro de 2017 12:20
  • Consegui evitar a excessão, mas como eu transformo os caracteres inseridos numa label no DateTime.

    Agora com esse código, somente a data 12/25/2017 é gravada no bando de dados, como posso fazer qualquer data inserida na label para ser inserida no banco de dados?

    _mdlAtarefador.Termino = DateTime.ParseExact("12/25/2017", "MM/dd/yyyy", CultureInfo.InvariantCulture)

    sexta-feira, 17 de novembro de 2017 12:24
  • Caso queira a data vindo de um label é só passar como paramêtro:

    _mdlAtarefador.Termino =  _mdlAtarefador.Termino = DateTime.ParseExact(txtDateTermino.Text, "MM/dd/yyyy", CultureInfo.InvariantCulture)

    onde txtDateTermino  é o seu label.

    • Sugerido como Resposta Felipeta sexta-feira, 17 de novembro de 2017 12:47
    • Marcado como Resposta Filipe B CastroModerator segunda-feira, 20 de novembro de 2017 12:36
    sexta-feira, 17 de novembro de 2017 12:29
  • Amigo, tu me ajudou mais que os professores da faculdade, muito obrigado, vou tentar fazer os últimos detalhes nesse sistema de cadastro, qualquer dificuldade posso perguntar aqui mesmo, ou abro outra pergunta?
    sexta-feira, 17 de novembro de 2017 12:44
  • Se for referente ao mesmo assunto de 'DateTime' , publique aqui, caso não , crie outra pergunta.

    Se este fórum te ajudou, marque algum comentário como resposta para a sua questão, para que outras pessoas, ao procurarem, vejam que ja foi resolvida.
    • Editado Felipeta sexta-feira, 17 de novembro de 2017 12:49
    sexta-feira, 17 de novembro de 2017 12:47