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.