web-dev-qa-db-fra.com

Lecture d'une date à l'aide de DataReader

J'ai lu une chaîne en utilisant ce format avec un lecteur de données. Comment puis-je lire une date en utilisant un format similaire?

while (MyReader.Read())
{
    TextBox1.Text = (string)MyReader["Note"];
}
25
TeaDrinkingGeek

Essayez comme indiqué ci-dessous:

while (MyReader.Read())
{
    TextBox1.Text = Convert.ToDateTime(MyReader["DateField"]).ToString("dd/MM/yyyy");
}

dans la méthode ToString(), vous pouvez modifier le format des données selon vos besoins.

33
Sukhjeevan

Si la colonne de la requête a un type approprié, alors

var dateString = MyReader.GetDateTime(MyReader.GetOrdinal("column")).ToString(myDateFormat)

Si la colonne de la requête est en fait une chaîne, voyez les autres réponses.

11
Richard
 (DateTime)MyReader["ColumnName"];

OR

Convert.ToDateTime(MyReader["ColumnName"]);
7
Muhammad Akhtar

Cela peut sembler un peu hors sujet, mais c’est le billet que j’ai rencontré en me demandant ce qui se passe lorsque vous lisez une colonne en tant que dateTime in c #. Cet article reflète les informations que j'aurais aimé pouvoir trouver sur ce mécanisme. Si vous vous souciez de l'utc et du fuseau horaire, lisez la suite

J'ai fait un peu plus de recherches car je suis toujours très méfiant envers DateTime en tant que classe en raison de ses hypothèses automatiques sur le fuseau horaire que vous utilisez et parce qu'il est trop facile de confondre heure locale et heure locale.

Ce que j’essaie d’éviter ici, c’est DateTime: 'oh regarde l’ordinateur sur lequel j’exécute l’ordinateur est dans le fuseau horaire x; répondez comme si j'étais dans ce fuseau horaire '

J'essayais de lire une colonne datetime2.

La date à laquelle vous reviendrez du serveur SQL finira par être de Kind.Unspecified, ce qui semble vouloir dire qu'il est traité comme un temps UTC, ce que je voulais. 

Lors de la lecture d'une colonne date, vous devez également la lire comme une DateTime même si elle n'a pas le temps et est encore plus encline à gâcher par les fuseaux horaires (car il est à minuit).

Je considérerais certainement cela comme un moyen plus sûr de lire DateTime car je soupçonne qu'il peut probablement être modifié soit par les paramètres du serveur SQL, soit par des paramètres statiques dans votre c #:

var time = reader.GetDateTime(1);
var utcTime = new DateTime(time.Ticks, DateTimeKind.Utc);

À partir de là, vous pouvez obtenir les composants (jour, mois, année), etc. et formater à votre guise.

Si ce que vous avez est en fait une date + une heure, Utc peut ne pas être ce que vous voulez là-bas - puisque vous bafouillez le client, vous devrez peut-être le convertir d'abord en heure locale (en fonction de la signification de l'heure ). Cependant, cela ouvre toute une boîte de vers. Si vous avez besoin de le faire, je vous recommande d’utiliser une bibliothèque comme noda time . Il y a TimeZoneInfo dans la bibliothèque standard, mais après une brève recherche, il ne semble pas y avoir de ensemble de fuseaux horaires corrects . Vous pouvez voir la liste fournie par TimeZoneInfo en utilisant la méthode TimeZoneInfo.GetSystemTimeZones();

J'ai aussi découvert que SQL Server Management Studio ne convertissait pas les heures en heure locale avant de les afficher. Ce qui est un soulagement!

7
JonnyRaa

Dans mon cas, j'ai modifié le champ datetime de la base de données SQL pour ne pas autoriser la valeur null. SqlDataReader m'a ensuite permis de convertir la valeur directement en DateTime.

0
user2328824
        /// <summary>
    /// Returns a new conContractorEntity instance filled with the DataReader's current record data
    /// </summary>
    protected virtual conContractorEntity GetContractorFromReader(IDataReader reader)
    {
        return new conContractorEntity()
        {
            ConId = reader["conId"].ToString().Length > 0 ? int.Parse(reader["conId"].ToString()) : 0,
            ConEmail = reader["conEmail"].ToString(),
            ConCopyAdr = reader["conCopyAdr"].ToString().Length > 0 ? bool.Parse(reader["conCopyAdr"].ToString()) : true,
            ConCreateTime = reader["conCreateTime"].ToString().Length > 0 ? DateTime.Parse(reader["conCreateTime"].ToString()) : DateTime.MinValue
        };
    }

OR

        /// <summary>
    /// Returns a new conContractorEntity instance filled with the DataReader's current record data
    /// </summary>
    protected virtual conContractorEntity GetContractorFromReader(IDataReader reader)
    {
        return new conContractorEntity()
        {
            ConId = GetValue<int>(reader["conId"]),
            ConEmail = reader["conEmail"].ToString(),
            ConCopyAdr = GetValue<bool>(reader["conCopyAdr"], true),
            ConCreateTime = GetValue<DateTime>(reader["conCreateTime"])
        };
    }

// Base methods
        protected T GetValue<T>(object obj)
    {
        if (typeof(DBNull) != obj.GetType())
        {
            return (T)Convert.ChangeType(obj, typeof(T));
        }
        return default(T);
    }

    protected T GetValue<T>(object obj, object defaultValue)
    {
        if (typeof(DBNull) != obj.GetType())
        {
            return (T)Convert.ChangeType(obj, typeof(T));
        }
        return (T)defaultValue;
    }
0
ADM-IT

Je sais que c’est une vieille question, mais je suis surpris qu’aucune réponse ne mentionne GetDateTime :

Obtient la valeur de la colonne spécifiée en tant qu'objet DateTime.

Que vous pouvez utiliser comme:

while (MyReader.Read())
{
    TextBox1.Text = MyReader.GetDateTime(columnPosition).ToString("dd/MM/yyyy");
}
0