Saltar al contenido

Uso de DateTime en un SqlParameter para un procedimiento almacenado, error de formato

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?

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *