Solución:
¿Cómo está configurando el SqlParameter
? Deberías configurar el SqlDbType
propiedad a SqlDbType.DateTime
y luego pasar el DateTime
directamente al parámetro (NO convierta a una cadena, entonces está pidiendo un montón de problemas).
Debería poder introducir el valor en la base de datos. Si no es así, 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 hacerlo, porque SQL Server no sabe que una hora en particular se encuentra en una zona / zona horaria 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 de 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 al ToUniversalTime
método, no convirtiéndolo en una cadena) al procedimiento almacenado.
Y cuando recupere el valor, llame al ToLocalTime
método para obtener la hora en la zona horaria local.
Así es como agrego parámetros:
sprocCommand.Parameters.Add(New SqlParameter("@Date_Of_Birth",Data.SqlDbType.DateTime))
sprocCommand.Parameters("@Date_Of_Birth").Value = DOB
Supongo que cuando escribe DOB no hay comillas.
¿Está utilizando un control de terceros para obtener la fecha? He tenido problemas con la forma en que se genera el valor de texto a partir de algunos de ellos.
Por último, ¿funciona si escribe el atributo .Value del parámetro sin hacer referencia a DOB?