Problemas ao trabalhar com datas no banco de dados usando um maskedtextbox no formato dd/MM/yyyy

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!!

Acredito que esta possa ser a solução:

string sql = “”;
sql += " Insert Into SisIndice (FAT, nSerie, idDefeito, DataFat) ";
sql += " Values ( ";
sql += " " + txtFat.Text + ", “;
sql += " '” + txtnSerie.Text + "’, ";
sql += " " + cboDefeito.SelectedValue + ", ";
sql += “TO_TIMESTAMP( #” + mskData.Text + “# , #DD/MM/YY#)”;
sql += " ) ";

Espero ter ajudado.

Leandro,

A principio eu recomendaria você utilizar Expressão Regular no lugar do MaskedTextBox, entretanto se não for possível acredito que poderia atribuir o texto do campo em uma variável DateTime e depois alterar o formado com a função ToString:

`DateTime dtInicio = DateTime.MinValue;
dtInicio = Convert.ToDateTime(mskData.Text)

dtFinal.ToString(“yyyy/MM/dd”)`