wake-up-neo.net

Ein Datum mit DataReader lesen

Ich habe eine Zeichenfolge mit diesem Format mit einem Datenleser gelesen. Wie kann ich ein Datum in einem ähnlichen Format einlesen?

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

Versuchen Sie es wie folgt:

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

in ToString() können Sie das Datenformat entsprechend Ihrer Anforderung ändern.

33
Sukhjeevan

Wenn die Spalte der Abfrage dann einen geeigneten Typ hat

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

Wenn die Spalte der Abfrage tatsächlich eine Zeichenfolge ist, sehen Sie andere Antworten.

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

OR

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

Dies scheint ein wenig abzulehendes Thema zu sein, aber dies war der Beitrag, auf den ich gestoßen bin, als ich mich fragte, was passiert, wenn Sie eine Spalte als dateTime in c # lesen. Der Beitrag spiegelt die Informationen wider, die ich gerne über diesen Mechanismus gefunden hätte. Wenn Sie sich um utc und Zeitzonen kümmern, lesen Sie weiter unter.

Ich habe ein wenig mehr recherchiert, da ich DateTime als Klasse immer sehr misstrauisch halte, da es automatisch Annahmen über die von Ihnen verwendete Zeitzone gibt und weil es viel zu einfach ist, Ortszeiten und UTC-Zeiten zu verwechseln.

Was ich hier zu vermeiden versuche, ist DateTime. 'Oh, der Computer, auf dem ich ausgeführt werde, befindet sich in der Zeitzone x, daher muss dieses Mal auch die Zeitzone x sein als ob ich in dieser Zeitzone bin '

Ich habe versucht, eine datetime2-Spalte zu lesen.

Das Datum, an dem Sie vom SQL Server zurückkommen, wird Kind.Unspecified sein. Dies scheint zu bedeuten, dass es wie UTC behandelt wird, was ich wollte. 

Wenn Sie eine date-Spalte lesen, müssen Sie sie auch als DateTime lesen, auch wenn sie keine Zeit hat und noch anfälliger für Zeitzonen ist (wie bei Mitternacht).

Ich würde dies sicherlich als sicherere Methode zum Lesen der DateTime-Methode betrachten, da ich vermute, dass sie wahrscheinlich entweder durch Einstellungen im SQL-Server oder durch statische Einstellungen in Ihrem c # geändert werden kann:

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

Von dort können Sie die Komponenten (Tag, Monat, Jahr) usw. abrufen und formatieren, wie Sie möchten.

Wenn das, was Sie haben, tatsächlich ein Datum und eine Uhrzeit ist, ist Utc möglicherweise nicht das, was Sie dort wollen. Da Sie sich auf dem Client herumtreiben, müssen Sie ihn möglicherweise zuerst in eine Ortszeit umwandeln (abhängig von der Bedeutung der Zeit) ). Dies eröffnet jedoch eine ganze Reihe von Würmern. Wenn Sie dies tun müssen, würde ich empfehlen, eine Bibliothek wie noda time zu verwenden. Es gibt TimeZoneInfo in der Standardbibliothek, aber nach einer kurzen Untersuchung scheint es keine richtigen Zeitzonen zu geben. Sie können die von TimeZoneInfo bereitgestellte Liste mit der Methode TimeZoneInfo.GetSystemTimeZones(); sehen.

Ich habe auch festgestellt, dass SQL Server Management Studio die Zeiten nicht in Ortszeit konvertiert, bevor sie angezeigt werden. Was ist eine Erleichterung!

7
JonnyRaa

In meinem Fall habe ich das datetime-Feld in der SQL-Datenbank geändert, um keine Nullwerte zuzulassen. SqlDataReader erlaubte mir dann, den Wert direkt in eine DateTime umzuwandeln.

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

Ich weiß, dass dies eine alte Frage ist, aber ich bin überrascht, dass in keiner Antwort GetDateTime erwähnt wird:

Ruft den Wert der angegebenen Spalte als DateTime-Objekt ab.

Welches können Sie verwenden wie:

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