none
Armazenar data inválida? RRS feed

  • Pergunta

  • Uma outra duvida sobre essa questao de data e hora.

    No meu caso, algumas vezes recebo datas e horas invalidas, qual seria a melhor soluçao nesse caso? Tratar os valores invalidos e assim armazeno a data como "01/01/1900 00:00:00"?

    E ao exibir os dados no grid na aplicaçao, verifico se a data e "01/01/1900 00:00:00" e assim exibo no grid o seguinte formato: "--/--/---- --:--:--"?

    Sei que alguns vao dizer para nao armazenar, mas como existe outras informaçoes corretas, o pessoal aqui pediu para tratar os dados e exibir o historico mesmo com a data errada.

    terça-feira, 2 de dezembro de 2008 22:41

Respostas

  •  Marcelo Tamanini wrote:

    Eu pensei em deixar como nulo, mas eu tentei passar null na variável DateTime do C# e acabou gerando erro.

    Uma maneira seria, eu fazer uma condição para verificar se minha data está como "01/01/1900 00:00:00" e assim, ao invés de eu passar a variavel no parametro da SP, passo "null", correto?

     

    Olá Marcelo,

     

    Uma coisa é o null no C#, e outra coisa é o NULL do banco de dados (DbNull.ValueWink.

     

    O DateTime é um tipo valor (assim como int, long, double), por isso você não pode atribuir null diretamente, mas você tem algumas alternativas:

     

    1-) Tornar as suas variáveis que guardam a Data e Hora como Nullable:

     

    Code Snippet

     

     // Declara a variável como Nullable conseguir atribuir null

     Nullable<DateTime> dataNascimento;

     // ...

     

     // Atribui null à variável

     dataNascimento = null;

     

     // ...

     // Na hora de inserir os dados:

     

     // Existe algum valor na variável (!= null)?

     if (dataNascimento.HasValue)

     {

    // Sim... Insere a data na base de dados

    sqlCmd.Parameters.AddWithValue("@DataNascimento", dataNascimento.Value);

     }

     else

     {

    // Não... Insere NULL na base de dados

    sqlCmd.Parameters.AddWithValue("@DataNascimento", DBNull.Value);

     }

     

     

     

    2-) Manter as variáveis como DateTime, e assumir que a menor data possível (01/01/0001) corresponde à null (não é a melhor escolha em minha opinião):

    Code Snippet

     

     // Declara a variável como DateTime

     DateTime dataNascimento;

     // ...

     

     // Atribui o menor valor possível (01/01/0001)

     dataNascimento = DateTime.MinValue;

     

     // ...

     // Na hora de inserir os dados:

     

     // Existe uma data maior que 01/01/0001?

     if (dataNascimento > DateTime.MinValue)

     {

    // Sim... Insere a data na base de dados

    sqlCmd.Parameters.AddWithValue("@DataNascimento", dataNascimento);

     }

     else

     {

    // Não... Insere NULL na base de dados

    sqlCmd.Parameters.AddWithValue("@DataNascimento", DBNull.Value);

     }

     

     

     

    Nota: Repare que independente da alternativa, quando você quiser gravar NULL na base de dados, você envia DBNull.Value no valor do parâmetro.

     

    Abraços,

    Caio Proiete




    Caio Proiete
    http://www.caioproiete.com
terça-feira, 2 de dezembro de 2008 23:42

Todas as Respostas

  • Boa Noite,

     

    Acho que deve se armazenar já que há outras informações corretas, mas penso que há uma ligeira separação entre o que é armazenado e o que é gravado. Se a data é inválida (mas é obrigatória), considere colocá-la como NULL. Assim você saberá que todas as datas inválidas estão nulas. Tratar uma data inválida como válida pode levar a problemas futuros, por isso, acho que utilizar a data 01/01/1900 não é uma boa idéia.

     

    [ ]s,

     

    Gustavo

    terça-feira, 2 de dezembro de 2008 22:49
  • Boa noite,

    Gustavo.

     

    Eu pensei em deixar como nulo, mas eu tentei passar null na variável DateTime do C# e acabou gerando erro.

    Uma maneira seria, eu fazer uma condição para verificar se minha data está como "01/01/1900 00:00:00" e assim, ao invés de eu passar a variavel no parametro da SP, passo "null", correto?

    terça-feira, 2 de dezembro de 2008 22:57
  •  Marcelo Tamanini wrote:

    Eu pensei em deixar como nulo, mas eu tentei passar null na variável DateTime do C# e acabou gerando erro.

    Uma maneira seria, eu fazer uma condição para verificar se minha data está como "01/01/1900 00:00:00" e assim, ao invés de eu passar a variavel no parametro da SP, passo "null", correto?

     

    Olá Marcelo,

     

    Uma coisa é o null no C#, e outra coisa é o NULL do banco de dados (DbNull.ValueWink.

     

    O DateTime é um tipo valor (assim como int, long, double), por isso você não pode atribuir null diretamente, mas você tem algumas alternativas:

     

    1-) Tornar as suas variáveis que guardam a Data e Hora como Nullable:

     

    Code Snippet

     

     // Declara a variável como Nullable conseguir atribuir null

     Nullable<DateTime> dataNascimento;

     // ...

     

     // Atribui null à variável

     dataNascimento = null;

     

     // ...

     // Na hora de inserir os dados:

     

     // Existe algum valor na variável (!= null)?

     if (dataNascimento.HasValue)

     {

    // Sim... Insere a data na base de dados

    sqlCmd.Parameters.AddWithValue("@DataNascimento", dataNascimento.Value);

     }

     else

     {

    // Não... Insere NULL na base de dados

    sqlCmd.Parameters.AddWithValue("@DataNascimento", DBNull.Value);

     }

     

     

     

    2-) Manter as variáveis como DateTime, e assumir que a menor data possível (01/01/0001) corresponde à null (não é a melhor escolha em minha opinião):

    Code Snippet

     

     // Declara a variável como DateTime

     DateTime dataNascimento;

     // ...

     

     // Atribui o menor valor possível (01/01/0001)

     dataNascimento = DateTime.MinValue;

     

     // ...

     // Na hora de inserir os dados:

     

     // Existe uma data maior que 01/01/0001?

     if (dataNascimento > DateTime.MinValue)

     {

    // Sim... Insere a data na base de dados

    sqlCmd.Parameters.AddWithValue("@DataNascimento", dataNascimento);

     }

     else

     {

    // Não... Insere NULL na base de dados

    sqlCmd.Parameters.AddWithValue("@DataNascimento", DBNull.Value);

     }

     

     

     

    Nota: Repare que independente da alternativa, quando você quiser gravar NULL na base de dados, você envia DBNull.Value no valor do parâmetro.

     

    Abraços,

    Caio Proiete




    Caio Proiete
    http://www.caioproiete.com
terça-feira, 2 de dezembro de 2008 23:42
  • Ok, obrigado pela ajuda pessoal.

     

    Caio:

    Eu estava imaginando fazer algo como a sua 2ª alternativa, mas vou fazer como na 1ª.

    Mas eu atribuindo a variavel como null, nao tem como eu passar direto a variavel, sem precisar fazer uma condiçao?

    Ex:

     

    Code Snippet

    // Declara a variável como Nullable conseguir atribuir null

     Nullable<DateTime> dataNascimento;

     // ...

     

     // Atribui null à variável

     dataNascimento = null;

     

    // Não... Insere NULL na base de dados

    sqlCmd.Parameters.AddWithValue("@DataNascimento", dataNascimento);

     

     

     

    quarta-feira, 3 de dezembro de 2008 10:56
  •  Marcelo Tamanini wrote:
    Mas eu atribuindo a variavel como null, nao tem como eu passar direto a variavel, sem precisar fazer uma condiçao?

     

    Olá Marcelo,

     

    Você não pode passar diretamente a variável porque, novamente:

     

    Uma coisa é o null no C#, e outra coisa é o NULL do banco de dados (DbNull.ValueBig Smile Big Smile

     

    Abraços,
    Caio Proiete




    Caio Proiete
    http://www.caioproiete.com
    quarta-feira, 3 de dezembro de 2008 11:13
  • rsrsrs

    Ok, mas bem que poderia ser assim!

    quarta-feira, 3 de dezembro de 2008 11:57