web-dev-qa-db-ja.com

DataRowからDateTime値を取得する(C#)

行からC#でDateTime値を取得するにはどうすればよいですか。現在のコードでエラーが発生しているため、どんな助けでもありがたいです。データは進行状況データベースから取得されます。

foreach (DataRow r in ds.Tables[0].Rows)
{
    string prodCode = r["PRD-CDE"].ToString();
    statCode = r["STAT"].ToString();
    DateTime firstIssueDate = (DateTime)(r["FISS"]); 
    DateTime endIssueDate = (DateTime)(r["EISS"]);
    if(endIssueDate > DateTime.Now)
    { /*do some thing...*/}
    else {/*user invalid...*/}
}

日付変換とパースを取得するには2つの方法があります。すべてのヘルプに感謝します

最終作業コードスニペット:

foreach (DataRow r in ds.Tables[0].Rows)
            {
                string prodCode = r["PRD-CDE"].ToString(),statCode = r["STAT"].ToString();
               // r.<DateTime?>("FISS");
                if (r["FISS"] != DBNull.Value)
                {
                    DateTime firstIssueDate = Convert.ToDateTime(r["FISS"]);
                    if (r["EISS"] != DBNull.Value)
                    {
                        DateTime endIssueDate = DateTime.Parse(r["EISS"].ToString());
                        if (endIssueDate > DateTime.Now)
                        {
18
Developer

これは単なる推測ですが、データベース内の対応する型がDateTimeである場合、列がnull可能かどうかを確認できますか?

もしそうなら、あなたはチェックをしたいかもしれませんr["column"] == DBNull.Valueし、それをnull可能なDateTimeに渡しますか?フィールド。

またはさらに簡単:

row.Field<DateTime?>("column")

そうでない場合は、そうです、Convert.ToDateTime()または他の何かがそれを行う必要があります。

編集:

私はあなたの最終的なコードをそこで見ますが、あなたがこれをしたい可能性はあります:

DateTime? firstIssueDate = r.Field<DateTime?>("fiss"); 
DateTime? endIssueDate = r.Field<DateTime?>("eiss"); 

if (firstIssueDate.HasValue && endIssueDate.HasValue) 
{ 
    firstIssueDate.Value // blah blah 
    endIssueDate.Value // blah blah 
}
41
Robert Luong

行がそのインデックスの文字列を返す場合は、DateTime.Parse()を使用することをお勧めします。

 string prodCode = r["PRD-CDE"].ToString(),statCode = r["STAT"].ToString();
 DateTime firstIssueDate = DateTime.Parse(r["FISS"].ToString());
 DateTime endIssueDate = DateTime.Parse(r["EISS"].ToString());

必要に応じて、TryParseを使用することもできます。

12
Chris Thompson

Null(DateTime?)またはDBNullではなくデフォルト値(DateTime.MinValueなど)を使用する場合は、次のようにします。

var firstIssueDate = r["FISS"] as DateTime? ?? DateTime.MinValue;
var endIssueDate = r["EISS"] as DateTime? ?? DateTime.MinValue;
5
brianary
foreach (DataRow r in ds.Tables[0].Rows)
{
    string prodCode = r["PRD-CDE"].ToString();
    string statCode = r["STAT"].ToString();
    DateTime firstIssueDate = DateTime.Parse((r["FISS"]).ToString()); 
    DateTime endIssueDate = DateTime.Parse((r["EISS"]).ToString());
    if(endIssueDate > DateTime.Now)
    { /*do some thing...*/}
    else {/*user invalid...*/}
}

これはコンパイルされ、動作する可能性があります。ただし、本番用コードで実行する必要があるエラーチェックは実行されません。また、DateTime.TryParseを調べ、IFormatProviderを追加して、フォーマットが期待どおりに解析されることを確認してください。

2
Timothy Carter

まず、r ["FISS"]。GetType()を実行してコンソールに出力します(または一時停止してデバッガーで確認します)。文字列であると表示されている場合は、上記のアドバイスのほとんどが役立ちます。他のことを言っている場合は、戻って質問を更新してください。

1
zvolkov

副次的な回答として、静的関数Convert.ToDateTimeも使用できます。

DateTime.Parse(r ["FISS"]。ToString())を使用する方法ですが、「文字列が有効なDateTimeとして認識されなかった」というエラーがスローされます。 r ["FISS"]列に実際の文字列を表示できますか?それは国際化の問題かもしれません...

0
Colin

.NET DateTime型に変換する必要がある特別な形式(標準の.NET DateTime形式ではない)のDateTime文字列がある場合は、DateTime.ParseExact()メソッドを使用できます。

例を含む詳細については MSDNドキュメント を参照してください。

解析するフォーマットが複数ある場合は、 DateTime.ParseExactメソッド(String、String []、IFormatProvider、DateTimeStyles) を試してください。

0
Chansik Im