Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Utilisation de DateTime dans un SqlParameter pour une procédure stockée, erreur de format

Comment configurez-vous le SqlParameter ? Vous devez définir le SqlDbType propriété à SqlDbType.DateTime puis passez le DateTime directement au paramètre (ne convertissez PAS en chaîne, vous posez alors un tas de problèmes).

Vous devriez pouvoir obtenir la valeur dans la base de données. Si ce n'est pas le cas, voici un exemple très simple de la façon de procéder :

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();
        }
    }
}

Je pense qu'une partie du problème ici est que vous craignez que le fait que l'heure soit en UTC ne soit pas transmis à SQL Server. À cette fin, vous ne devriez pas, car SQL Server ne sait pas qu'une heure particulière se trouve dans une locale/un fuseau horaire particulier.

Si vous souhaitez stocker la valeur UTC, convertissez-la en UTC avant de la transmettre à SQL Server (sauf si votre serveur a le même fuseau horaire que le code client générant le DateTime , et même alors, c'est un risque, IMO). SQL Server stockera cette valeur et lorsque vous la récupérerez, si vous souhaitez l'afficher à l'heure locale, vous devez le faire vous-même (ce que le DateTime struct le fera facilement).

Ceci étant dit, si vous effectuez la conversion puis passez la date UTC convertie (la date qui est obtenue en appelant le ToUniversalTime méthode, et non par conversion en chaîne) à la procédure stockée.

Et lorsque vous récupérez la valeur, appelez le ToLocalTime méthode pour obtenir l'heure dans le fuseau horaire local.