Existen varias preguntas sobre el uso de .Net DateTime en las sentencias Sql, pero ninguna de ellas resolvió mi problema.Forma correcta de utilizar .Net DateTime en cadena SQL parametrizada
estoy usando el siguiente código para consultar una base de datos Oracle:
private DataTable QueryByIdAndDate(string id, DateTime fdate, DateTime tdate) {
string query = "SELECT * FROM table WHERE ID = :id AND DATE_TIME BETWEEN :from AND :to"
DbCommand cmd = db.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = query;
DbParameter fromDate = CreateDateParameter(cmd, fdate);
fromDate.ParameterName = "from";
DbParameter toDate = CreateDateParameter(cmd, tdate);
toDate.ParameterName = "to";
DbParameter idParam = CreateStringParameter(cmd, id);
idParam.ParameterName = "id";
cmd.Parameters.AddRange(new DbParameter[] { fromDate, toDate, idParam });
return db.ExecuteQuery(cmd);
}
private DbParameter CreateDateParameter(DbCommand cmd, DateTime date) {
DbParameter param = cmd.CreateParameter();
param.DbType = DbType.DateTime;
param.Direction = ParameterDirection.Input;
param.Value = date;
return param;
}
Pero no funciona correctamente. Al tratar el código a cabo de esta manera:
DataTable result = QueryByIdAndDate("12345", DateTime.Now, DateTime.Now.AddDays(1));
Se da el siguiente error: ORA-01847 : día del mes debe estar entre 1 y último día del mes
Estoy asumiendo que tiene que ver con la forma en que DateTime está formateado, pero no sé la manera correcta de solucionarlo de manera confiable.
No estaría ejecutándolo por 30 de mes con solo 30 días, ¿verdad? –
No. Falló con el ejemplo que mostré usando DateTime.Now y DateTime.Now.AddDays (1); – user12345613
¿Su controlador definitivamente soporta parámetros con nombre? Si está tratando de usarlos por posición, terminará usando el valor "id" como la parte "a", que podría romperse. ¿Qué conductor estás usando? –