Date de sauvegarde Utc en tant que date locale dans SQLite

c# dapper datetime sql sqlite

Question

J'ai une base de données SQL qui contient un champ de date.

J'utilise Dapper pour mettre à jour la base de données comme suit:

const string sql = "UPDATE AdminDb.Users " +
                   "SET IsLoggedOn = 1, LastLoggedOn = @LastLoggedOn " +
                   "WHERE Username = @username";
var date = DateTime.UtcNow;
DatabaseConnectionBase.DatabaseConnection.Execute(sql, new { username, LastLoggedOn = date });

Je trouve à ma grande contrariété lors de la rupture avant la mise à jour réelle, la variable de date lit 30/3/2015 9:32:54 cependant quand je lance la mise à jour la base de données enregistre la date comme 30/3/2015 10:32:54

Comme le Royaume-Uni a changé hier de GMT à BST (UTC +1), je suis sûr que la base de données semble essayer de compenser cela car ce problème n’a jamais été abordé auparavant.

Je pensais avoir évité ce genre de problème en utilisant la propriété DateTime.UtcNow pour enregistrer ma date.

Cela pose de sérieux problèmes lors de la validation des utilisateurs.

  • Je suis sûr que ce n’est pas mon code car la date est correcte pour la méthode Dapper Execute.
  • Je ne vois pas pourquoi Dapper essaierait de compenser car la plupart des développeurs criaient à de telles fonctionnalités
  • Ce qui m'amène à la conclusion que ce problème doit être causé par Sqlite. Peut-être y a-t-il un pragma que je dois courir?

Selon une suggestion d'un autre site, j'ai essayé de formater la date comme suit:

var date = DateTime.UtcNow.ToString("o");

L'intention étant de forcer la date au format ISO-8601 mais je n'ai pas eu de chance avec ça.

Quelqu'un a-t-il des idées?

Réponse acceptée

Cela m'est arrivé aussi. Ce que j'ai fait, c'est sérialiser le datetime en une chaîne avant de l'ajouter en tant que paramètre.

internal const string DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
cmd.Parameters.Add("@Threshold", DbType.DateTime).Value = threshold.ToString(DateTimeFormat);

Réponse d'expert

Si vous faites la même chose avec ADO.NET pur, est-ce que la même chose se produit? Je me demande s'il s'agit d'une chose de base de données ou d'un fournisseur plutôt que d'une bibliothèque. Dapper doit ToLocalTime() ou ToUniversalTime() appels - il passe le temps sans altération. Sur SQL Server, les éléments suivants fonctionnent correctement dans un paramètre BST:

    public void SO29343103_UtcDates()
    {
        const string sql = "select @date";
        var date = DateTime.UtcNow;
        var returned = connection.Query<DateTime>(sql, new { date }).Single();
        var delta = returned - date;
        Assert.IsTrue(delta.TotalMilliseconds >= -1 && delta.TotalMilliseconds <= 1);
    }



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi