¿Cómo está configurando el SqlParameter
? ? Debe establecer el SqlDbType
propiedad a SqlDbType.DateTime
y luego pase el DateTime
directamente al parámetro (NO convierta a una cadena, entonces está buscando un montón de problemas).
Debería poder obtener el valor en la base de datos. Si no, aquí hay un ejemplo muy simple de cómo hacerlo:
static void Main(string[] args)
{
// Create the connection.
using (SqlConnection connection = new SqlConnection(@"Data Source=..."))
{
// Open the connection.
connection.Open();
// Create the command.
using (SqlCommand command = new SqlCommand("xsp_Test", connection))
{
// Set the command type.
command.CommandType = System.Data.CommandType.StoredProcedure;
// Add the parameter.
SqlParameter parameter = command.Parameters.Add("@dt",
System.Data.SqlDbType.DateTime);
// Set the value.
parameter.Value = DateTime.Now;
// Make the call.
command.ExecuteNonQuery();
}
}
}
Creo que parte del problema aquí es que le preocupa que el hecho de que la hora esté en UTC no se transmita a SQL Server. Con ese fin, no debería, porque SQL Server no sabe que una hora en particular se encuentra en una zona horaria/local en particular.
Si desea almacenar el valor UTC, conviértalo a UTC antes de pasarlo a SQL Server (a menos que su servidor tenga la misma zona horaria que el código del cliente que genera el DateTime
, e incluso entonces, eso es un riesgo, en mi opinión). SQL Server almacenará este valor y cuando lo recupere, si desea mostrarlo en la hora local, debe hacerlo usted mismo (que el DateTime
struct lo hará fácilmente).
Dicho todo esto, si realiza la conversión y luego pasa la fecha UTC convertida (la fecha que se obtiene llamando a ToUniversalTime
método, no mediante la conversión a una cadena) al procedimiento almacenado.
Y cuando recupere el valor, llame a ToLocalTime
método para obtener la hora en la zona horaria local.