2009-02-26 14 views
6

私は、DAAB 4.0フレームワークでc#を使用して、datareaderからdbtype.timeの列タイプを使用してMS SQL 2008データベースから結果を読み取りました。DbType.Timeの結果をTimespanオブジェクトに変換する方法

私の問題は、dbtype.timeはタイムパンにマップする必要がありますが、私が見ているタイムパンの唯一のクローズコンストラクタはlongを受け取り、データウェアハウスから返された結果をlong型に直接キャストすることはできません期間。

私はこれを見つけましたArticleこれはdatareader.getTimeSpan()メソッドを示していますが、daab 4.0のdatareaderにはこのメソッドがないようです。

したがって、結果をdatareaderからtimespanオブジェクトに変換するにはどうすればよいですか?

答えて

6

GetTimeSpanOleDbDataReaderSqlDataReaderの方法である(ただし、より一般的なのIDataReaderインターフェースのどのDAABのExecuteReader戻ります)。 DAABが返すIDataReaderインスタンスが実際にSqlDataReaderのインスタンスであると仮定しています。これは、あなたがappropiately IDataReaderインスタンスをキャストしてGetTimeSpanメソッドにアクセスすることができます:

using (IDataReader dr = db.ExecuteReader(command)) 
{ 
    /* ... your code ... */ 
    if (dr is SqlDataReader) 
    { 
     TimeSpan myTimeSpan = ((SqlDataReader)dr).GetTimeSpan(columnIndex) 
    } 
    else 
    { 
     throw new Exception("The DataReader is not a SqlDataReader") 
    } 
    /* ... your code ... */ 
} 

編集:IDataReaderインスタンスは、あなたがあなたのApp.configファイルで定義された接続文字列のprovider属性を存在しない可能性がありますSqlDataReaderされていない場合(またはweb.config)。

0

.NET型の列値とは何ですか?それがDateTimeの場合は、Ticksプロパティ(long)の値をTimeSpanコンストラクタに渡すことができます。例えば。

var span = new TimeSpan(colValue.Ticks); 
9

このようなダイレクトキャストを試したことはありますか?

TimeSpan span = (TimeSpan)reader["timeField"]; 

私はちょうど私のマシン上ですぐにこれをテストし、「timeFieldは」データベース(SQL)のタイムデータ型であるとき、正常に動作します。


using (IDataReader reader = db.ExecuteReader(command)) 
{ 
    var timeSpan = reader.GetDateTime(index).TimeOfDay; 
} 

クリーナー、おそらく:

+0

あなたとケンの両方の解決策は良いです。ただし、値がnullの場合、Kenのソリューションの例外メッセージはより説明的です。 'SqlNullValueException - データがNULLです。このメソッドまたはプロパティは、Null値で呼び出すことはできません。 'VS' InvalidCastException - 指定されたキャストは無効です.' – TheWanderingMind

+1

BishopBarberコメントに返答するには、その列をnullにすることができる場合は、TimeSpanに変換する必要がありますか?ヌル可能型で、nullをチェックします。 'TimeSpan? span = reader ["tsfield"] == DBNull.Value? (TimeSpan?)null:(TimeSpan?)reader ["tsfield"] ' –

+0

インデックスを使用してデータリーダーにアクセスしないことが多いため、このソリューションが優れています。私はしかし、nullをチェックする中間的な方法があります。 – MichaelChan

1

は、ここに私のテイクです!

+0

データベース層は 'TIME'型を返すときに私のために' InvalidCastException'をスローしますが、 'GetDateTime()'で読み込もうとします。 – binki

関連する問題