Dapper

2016-03-15 21 views
5

kullanarak oracle'den zaman ofsetleri nasıl okunur? TIMESTAMP WITH TIME ZONE sütununda bir veri deposunda saklanan veriler var ve şimdi Dapper kullanarak bir C# DateTimeOffset değişkenine geri okumaya çalışıyorum. Sorun şu ki, dapper veritabanındaki ofset değerini yok sayar ve değişkemi her zaman ortamın mevcut ofseti ile doldurur.Dapper

Veritabanından ofset değerini tanıması için basit bir yöntem var mı?

bu geçersiz bir döküm istisna verir yazılı olarak
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); 

, şık bir DateTime olarak okur anlaşılmaktadır ardından göz ardı DateTimeOffset için döküm çalışır:

Temelde ben çalışmak bu satırlar boyunca bir şey görmek ister ofset değeri.

Bir tabloyu sorgulayan ve bu türlerle tanımlanan bir sınıf nesnesini dolduran kodum hata atmaz, ancak nesne örneğini veritabanındaki değer yerine yerel sapma ile doldurur. Bu yüzden yukarıdaki giriş değeriyle çalışıyor olsaydım, 2016-03-15 14:30 +0 yerine 2016-03-15 14:30 -5 ile sonuçlanırdım.

+0

Bunun bir Dapper sorunu olduğundan emin değilim, ancak ODP.Net ile ilgili. [Bu cevap] (http://stackoverflow.com/a/14140274/634824) yardım ediyor mu? –

+0

@Matt Gerçekten değil. Bir veri adaptörü kullanılıyorsa, dapper uygulamasında gömülüdür. Bu cevapta atıfta bulunulan ayarlara herhangi bir erişim bulamadım. – Rozwel

+0

'DateTimeOffset' utc’yi dönüştürmeyi denediniz mi? 'output = bağlantı.ExecuteScalar (" to_timestamp_tz ('"+ giriş.ToUniversalTime() öğesini seçin. ToString (" yyyy-AA-dd HH: mm zzz ") +"', 'YYYY-AA-DD HH24: MI TZH: TZM ') DUAL ");' –

cevap

0

yüzden diğer bazı kişiler bu soruya bakarak edilmiştir fark ve ben direkt cevap yok ederken, ben ... kullandığımız olmuştur bu işin etrafında paylaşır

Yasal düşündüm: Bu biraz bir klustır ve ben daha temiz bir yaklaşımı tercih ederim ama işe yarıyor.

Temel olarak, yaptığımız şey, Timestamp With Timezone sütunu, select deyimindeki biçimlendirilmiş bir dizeye dönüştürmekti. C# sınıfında, daha sonra aynı formatı kullanarak DateTimeOffset'in dize olarak temsil edilen bir özelliği ekledik. Ardından, Dapper'ın değeri string özelliği içine yerleştirmesini sağlamak için sorgudaki takma adları kullandık, bunun belirleyicisi bir DateTimeOffset öğesine geri yükler ve özgün özelliği ayarlar.

İlgili konular