In questi giorni mi sono trovato a dover effettuare una query da una pagina ASP.NET ad un database Access (cosa che ormai non facevo da tanto, visto l'amore che ho verso SQL Server). Per rispettare le varie politiche di sicurezza riguardo gli attacchi di sql injection, mi accingo ad utilizzare la classe OleDbParamter per passare i parametri necessari alla mia query.
Nel mio caso avevo un singolo parametro di tipo "data e ora".
Questo il codice che avevo scritto:

OleDbConnection conn = new OleDbConnection(strConn);

using (conn)
{
OleDbCommand cmd = new OleDbCommand();
using (cmd)
{
cmd.Connection = conn;
cmd.CommandText = "SELECT * FROM table WHERE campoData > @dataeora";
OleDbParameter param = new OleDbParameter("@dataeora", DateTime.Now);
cmd.Parameters.Add(param);

conn.Open();
OleDbDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
//... }
reader.Close();
}
}

Bene... una volta eseguito questo codice, mi vedo stampare a video questa bellissima eccezione:

System.Data.OleDb.OleDbException: Data type mismatch in criteria expression

Dopo un pò di prove, mi sono accorto che Access vuole il parametro (anche se di tipo DateTime) sotto forma di stringa. Quindi mi è bastato aggiungere la chiamata al metodo ToString() e il mio errore è sparito.

OleDbParameter param = new OleDbParameter("@dataeora", DateTime.Now.ToString());

La cosa però non mi piaceva molto.. e googlando un pò, ho trovato una soluzione un pò più pulita. Basta infatti specificare prima della query, il numero e il tipo dei parametri che andranno utilizzati nella query stessa.

OleDbConnection conn = new OleDbConnection(strConn);

using (conn)
{
OleDbCommand cmd = new OleDbCommand();
using (cmd)
{
cmd.Connection = conn;
cmd.CommandText = "PARAMETERS @dataeora datetime; " +
"SELECT * FROM table WHERE campoData > @dataeora";
OleDbParameter param = new OleDbParameter("@dataeora", DateTime.Now);
cmd.Parameters.Add(param);

//... }
}

Buono a sapersi per le prossime volte.. no ?