Olá a todos!

Neste meu primeiro artigo, eu quero tratar de uma dificuldade que encontrei na hora de desenvolver um simples sistema CRUD, onde em minha tabela feita em SQL Compact Edition 4.0 (daqui para frente chamarei apenas de SQLCE), precisei utilizar um campo do tipo DateTime! Poxa... SQL CE é bom, mas eu não consegui configurar direto este tipo de banco de dados para que o mesmo armazenasse a data no formato padrão brasileiro: dd/mm/yyyy.

Neste momento começou minha busca que durou horas no Google, Bing e MSDN, não encontrei nada que me ajudasse a resolver este problema, nem mesmo via C# diretamente! Até que no fim eu achei um artigo em inglês, que em duas linhas resolveu meu problema!

Mas Chega de blábláblá e vamos programar!

O problema

O usuário deve digitar em um MaskedTextBox uma Data no formato dd/MM/yyyy, mas no banco será armazenado como MM/dd/yyyy. Como Faço este "milagre"? Simples!!!

A solução

Ciraremos uma instância da Classe DateTimeFormatInfo e declaramos o formato padrão que a propriedade ShortDatePattern do DateTimeFormatInfo receberá, depois utilizaremos este objeto no método Convert.ToDateTime para especificar o formato do valor de entrada.

Você verá no exemplo abaixo como é simples, mas antes vamos aos pré-requisitos:

  • SQLCE Instalado.
  • Visual C# 2008/2010/2012 (no meu caso, utilizei 2012 RC).
  • Dentro do meu projeto eu adicionei a referência ao namespace
  • “System.Data.SqlServerCe".
  • Criei uma tabela chamada "Data" com o Campo "Favorita" do tipo ."Datetime" dentro do banco
  • "DateTimeSQLCEdb.sdf" com senha padrão “P@ssw0rd” e Persirty Security info verdadeiro.
  • No meu form, eu adionei um MaskedTextBox e formatei para data simples (00/00/0000).
  • Adiconei um button e label.

Será dentro do evento Click do botão que salva que eu farei o "milagre":

Listagem 1: Gravando a data no banco


private void btnSalva_Click(object sender, EventArgs e)
{
    string myStrConn = @"Data Source=C:\db\DateTimeSQLCEdb.sdf;Password=P@ssw0rd;Persist Security Info=True;";
    SqlCeConnection _conn = new SqlCeConnection(myStrConn);
    try
    {        
        System.Globalization.DateTimeFormatInfo dateInfoBr = new System.Globalization.DateTimeFormatInfo();
        dateInfoBr.ShortDatePattern = "dd/MM/yyyy";

        DateTime _myDate = Convert.ToDateTime(maskedTextBox.Text, dateInfoBr);
        string myCmdTxt = "INSERT INTO DATA (favorita) VALUES(@favorita);";

        SqlCeCommand cmd = new SqlCeCommand(myCmdTxt, _conn);
        cmd.Parameters.AddWithValue("@favorita", _myDate);
        _conn.Open();
        cmd.ExecuteNonQuery();

        lblRes.Text = "Inserido";
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        _conn.Close();
    }
}

Pronto! A maior parte do código exposto já é conhecida, o principal ponto está nas três primeiras linhas do bloco try, onde especificamos o formato em que se encontra a data digitada pelo usuário, para então podermos converter o String para DateTime sem confusões.

Espero ter ajudado e até o próximo artigo!