6

DAAB 4.0 フレームワークで c# を使用して、datareader から dbtype.time の列タイプを持つ MS SQL 2008 データベースから結果を読み取っています。

私の問題は、MSDN のドキュメントでは、dbtype.time は timespan にマップする必要があると書かれていますが、timespan のクローズ コンストラクターだけが long を受け入れ、datareader から返された結果を long にキャストしたり、timespan に直接キャストしたりできないことです。

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

では、datareader からの結果を timespan オブジェクトに変換するにはどうすればよいでしょうか。

4

4 に答える 4

10

このような直接キャストを試しましたか?

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

これを自分のマシンで簡単にテストしたところ、「timeField」がデータベース (SQL) の Time データ型である場合に正常に動作します。

于 2009-02-26T20:08:34.127 に答える
7

GetTimeSpanOleDbDataReaderおよびのメソッドですSqlDataReader(ただし、DAABがExecuteReader返すより一般的なIDataReaderインターフェイスのメソッドではありません)。IDataReaderDAABから返されたインスタンスは、実際にはのインスタンスであると想定していますSqlDataReader。これにより、インスタンスを適切GetTimeSpanにキャストすることでメソッドにアクセスできます。IDataReader

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インスタンスがaでない場合は、app.config(またはweb.config)で定義されている接続文字列SqlDataReaderの属性が欠落している可能性があります。provider

于 2009-02-26T20:05:05.790 に答える
1

これが私の見解です:


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

おそらく、よりきれいです!

于 2011-02-09T18:21:55.530 に答える
0

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

var span = new TimeSpan(colValue.Ticks);
于 2009-02-26T20:05:50.920 に答える