2016-03-15 12 views
5

Oracle TIMESTAMP WITH TIME ZONE列にデータが格納されていますが、これをDapperを使用してC#DateTimeOffset変数に読み取ろうとしています。問題は、dapperがデータベースのオフセット値を無視し、常に変数に現在の環境変数を設定していることです。Dapperを使用してoracleから時間オフセットを読み取る方法

データベースからのオフセット値をdapperに認識させる簡単な方法はありますか?

これは無効なキャスト例外を与えて書かれたよう
var input=new DateTimeOffset(2016, 3, 15, 14, 30, 0, TimeSpan.Zero); 
DateTimeOffset output; 
using(var connection=new OracleConnection(QueryConnectionString)) { 
    output=connection.ExecuteScalar<DateTimeOffset>("Select to_timestamp_tz('"+input.ToString("yyyy-MM-dd HH:mm zzz")+"', 'YYYY-MM-DD HH24:MI TZH:TZM') From DUAL"); 
} 
Assert.AreEqual(input, output); 

が、Dapperのは、日時としてそれを読み取っていることが表示され、その後、無視、のDateTimeOffsetにキャストしようとします:

は基本的に私は仕事、これらの線に沿って何かを見たいですオフセット値

テーブルを照会し、これらの型で定義されたクラスオブジェクトを移入するコードではエラーは発生しませんが、データベースの値ではなくローカルオフセットがオブジェクトインスタンスに設定されます。上記の入力値で作業していた場合、2016-03-15 14:30 +0の代わりに2016-03-15 14:30 -5で終わることになります。

+0

これはDapperの問題ではなく、むしろODP.Netに関連しているかどうかはわかりません。 [この回答](http://stackoverflow.com/a/14140274/634824)は役に立ちますか? –

+0

@Matt実際にはありません。データアダプタが使用されている場合、それはdapper実装に埋め込まれます。私はその答えに記載されている設定へのアクセスを見つけることができませんでした。 – Rozwel

+0

あなたは 'DateTimeOffset'をutcに変換しようとしましたか? (YYYY-MM-DD HH:mm zzz)+ YYYY-MM-DD HH24:'output = connection.ExecuteScalar (" to_timestamp_tz( '"+ input.ToUniversalTime() MI TZH:TZM ')DUALから ");' –

答えて

0

だから私はいくつか他の人がこの質問を見てきたと私は直接の答えを持っていませんが、私は、我々は...

免責事項を使用していた作業を周りに共有するだろうと思ったことに気づきました:これはちょっとしたものですが、私はもっとクリーンな方法を好むでしょうが、それは機能します。

私たちがやったことは、タイムスタンプ付きタイムゾーン列を、selectステートメントの書式設定された文字列に変換することでした。 C#クラスでは、同じフォーマットを使用して、DateTimeOffsetの文字列表現であるプロパティを追加しました。次に、クエリでエイリアスを使用して、Dapperが文字列プロパティに値を移入させ、そのセッターがDateTimeOffsetに解析して元のプロパティを設定するようにしました。

関連する問題