web-dev-qa-db-ja.com

DataReaderを使用して日付を読み取る

この形式を使用してデータリーダーで文字列を読み取ります。同様の形式を使用して日付を読み込むにはどうすればよいですか?

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

以下のように試してください:

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

ToString()メソッドでは、要件に応じてデータ形式を変更できます。

35
Sukhjeevan

クエリの列に適切なタイプがある場合

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

クエリの列が実際に文字列である場合、他の回答が表示されます。

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

OR

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

これは少しトピックから外れているように思えるかもしれませんが、これは、c#でdateTimeとして列を読み取るとどうなるかと思ったときに出くわした投稿でした。投稿には、このメカニズムについて見つけたいと思っていた情報が反映されています。 utcとタイムゾーンが気になる場合は、onを読んでください

DateTimeをクラスとして常に慎重に使用しているので、使用しているタイムゾーンに関する自動的な仮定と、ローカル時間とUTC時間を混同するのは簡単すぎるため、もう少し研究を行いました。

私がここで回避しようとしているのは、DateTimeがになっていることですそのタイムゾーンにいるかのように返信します」

_datetime2_列を読み取ろうとしていました。

SQLサーバーから返される日付時刻は、最終的に_Kind.Unspecified_になります。これは、UTCのように扱われることを意味するようです。

date列を読み取るときは、時間がなく、タイムゾーン(深夜0時のように)でさらにめちゃくちゃになっている場合でも、DateTimeとして読み取る必要があります。

これはおそらく、SQLサーバーの設定またはc#の静的設定のいずれかによって変更される可能性があるため、DateTimeを読み取るより安全な方法であると考えています。

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

そこからコンポーネント(日、月、年)などを取得し、好きなようにフォーマットできます。

あなたが実際に日付と時刻である場合、UTCはそこに望むものではないかもしれません-クライアントをいじくり回しているので、最初に現地時間に変換する必要があるかもしれません(時間の意味によっては) )。しかし、それはワームの缶全体を開きます..それを行う必要がある場合、 noda time のようなライブラリを使用することをお勧めします。標準ライブラリにはTimeZoneInfoがありますが、簡単に調査したところ、 適切なタイムゾーンのセット を持たないようです。メソッドTimeZoneInfo.GetSystemTimeZones();を使用すると、TimeZoneInfoが提供するリストを表示できます。

また、SQL Server Management Studioは、時刻を現地時間に変換してから表示しません。これは安心です!

7
JonnyRaa

私の場合、SQLデータベースのdatetimeフィールドを変更して、nullを許可しません。その後、SqlDataReaderを使用して、値を直接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

これは古い質問であることは知っていますが、答えが言及されていないことに驚いています GetDateTime

指定された列の値をDateTimeオブジェクトとして取得します。

次のように使用できます:

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