Estou usando um MaskedTextBox na cultura pt-BR pra forçar o usuário a
preencher a data no formato correto (dd/MM/yyyy). Retiro a string do
MaskedTextBox para inserir no banco de dados e registrar uma
informação contendo a data desta informação. Meu intuito é que o
usuário possa além de registrar algumas informações, possa também
realizar uma pesquisa por período de tempo filtrando as datas através de
dois MounthCalendar.
O problema é que aparentemente as informações estão sendo registradas
no formato MM/dd/yyyy e quando realizo a pesquisa por período, o banco
de dados retorna as datas com os meses invertidos com as datas.
Por exemplo, se eu registro um evento chamado de “Calibração” com a
data 02/03/2016 (02 de março de 2016) , no banco de dados o registro
fica como 03 de fevereiro de 2016. E se eu fizer uma pesquisa no período
de 01 de março de 2016 a 31 de março de 2016, o evento de "Calibração"
não aparece nos resultados. Mas, se fizer a pesquisa no período entre 01
e 29 de fevereiro de 2016 o evento aparece como se estivesse registrado
no dia 03 de fevereiro.
Não sei se estou enganado, mas creio que o problema esteja
acontecendo na hora de inserir no banco de dados, estou tentando
converter a string que é digitada no MaskedTextBox para o formato
MM/dd/yyyy mas não estou conseguindo.
Já tentei usar o DateTime.ParseExact mas surge o erro : “Cadeia de caracteres não foi reconhecida como DateTime válido.”
string dataDoFat = mskData.Text;
System.Globalization.DateTimeStyles none = new System.Globalization.DateTimeStyles();
IFormatProvider format = new System.Globalization.CultureInfo("en-US", true);
DateTime dtime = DateTime.ParseExact(dataDoFat, "MM/dd/yyyy",format);
O código que uso para inserir os registros no banco de dados é este:
Conexao ca = new Conexao();
string sql = "";
sql += " Insert Into SisIndice (FAT, nSerie, idDefeito, DataFat) ";
sql += " Values ( ";
sql += " " + txtFat.Text + ", ";
sql += " '" + txtnSerie.Text + "', ";
sql += " " + cboDefeito.SelectedValue + ", ";
sql += " #" + mskData.Text + "# ";
sql += " ) ";
ca.Conectar();
OleDbCommand cd = new OleDbCommand(sql, ca.cx);
try
{
cd.ExecuteNonQuery();
MessageBox.Show("Ocorrência registrada.");
}
catch (OleDbException x)
{
MessageBox.Show("Erro: " + x.Message);
}
ca.Desconectar();
LimparCampos();
E o que uso para ler os registros do banco de dados no período de tempo escolhido pelo usuário é este:
string DataInicio = mcInicio.SelectionStart.Date.ToString("MM/dd/yyyy");
string DataFim = mcFim.SelectionStart.Date.ToString("MM/dd/yyyy");
Conexao ca = new Conexao();
string sql = "";
sql += " Select ";
sql += " s.idProduto, s.FAT, s.nSerie, d.Defeito, s.DataFat ";
sql += " From ";
sql += " (SisIndice s INNER JOIN ";
sql += " Defeitos d ON s.idDefeito = d.idDefeito) ";
sql += " WHERE(((s.DataFat) BETWEEN ";
sql += " #" + DataInicio + "# ";
sql += " and ";
sql += " #" + DataFim + "#)) ";
ca.Conectar();
OleDbDataAdapter da = new OleDbDataAdapter(sql, ca.cx);
DataSet ds = new DataSet();
da.Fill(ds, "SisIndice");
dgvTestGraf.DataSource = ds.Tables["SisIndice"];
ca.Desconectar();
Realmente a solução é converter o formato da data inserida no banco de dados? Qual é a melhor maneira para se fazer isso?
Desde já agradeço!
Abs!!