Usuário com melhor resposta
Falha na DateTime

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
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
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)
-
-
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
-
-
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. -
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)
-
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
-
-
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