2013-12-19 40 views
2

我有一個使用SQL time(7)類型的現有數據庫,它不直接映射到.Net類型。如何使用Dapper-dot-net將SQL Time列映射到.Net類型?

問題:使用Dapper,如何將SQL time列映射到.Net類型?

問題:當我嘗試用精緻小巧點網一個SQL time(7)列隱含映射到DateTime,我得到以下異常:

型「System.Data.DataException」的例外發生在 Dapper.dll但在用戶代碼中沒有處理

其他信息:錯誤解析塔5 (CheckInTime = 08:54:43.1470000 - 對象)

我以爲它會自動映射到日期時間,但它似乎沒有這樣做

回答

0

看來,你必須明確地投/在T-SQL中列轉換爲任意日期時間或時間跨度取決於您的需要。

如果你的時間表示一天中的時間(即下午4:15)

string sql = @"SELECT CONVERT(DATETIME, InTime) AS CheckInTime FROM TimeLog"; 

var checkInTimes = _conn.Query<DateTime>(sql).ToList(); 

如果你的時間表示一天中的可空時間(即下午4:15或空)

要處理空時,只需將目標.Net類型更改爲可空(DateTime?):

// Note: the OutTime column is nullable 
string sql = @"SELECT CONVERT(DATETIME, OutTime) AS CheckOutTime FROM TimeLog"; 

var checkOutTimes = _conn.Query<DateTime?>(sql).ToList(); 

請注意,生成的DateTime對象的日期部分將被設置爲1900-01-01。

如果你的時間表示的時間量(如2小時47分運行時間)

在這種情況下,最好是轉化爲時間跨度,這將不包括無效1900日期,但也做不允許在的ToString AM/PM格式()

string sql = @"SELECT RunningTime FROM TimeLog"; 
var movieLength = _conn.Query<TimeSpan>(sql).ToList(); 

感謝莫羅指出這個用例。

1

我已經成功地將SQL時間(7)列映射到System.TimeSpan

正如丹指出的,如果您的意圖是表示一天中的某個時間,則TimeSpan「語義上」不太合適。

但是我認爲在技術上,從時間(7)到TimeSpan沒有任何信息丟失,所以數據就在那裏,這是一個意義問題。

我一直用來減輕醜陋的一種方法是使用私人TimeSpan屬性來查詢和公開自定義類型公共屬性中的數據。

我寧願過與在SQL調用CONVERT()組合使用DateTime,因爲即使有DateTime你還有你的數據的某種方式「不完美」的表現(日期部分是假的)你在SQL中也引入了醜陋。

但是,在這一點上,我認爲這可以被認爲是個人喜好的問題。

+0

好點!雖然它可能取決於我沒有提到的一個因素:時間(7)是用來表示一段時間還是表示一天的時間?如果有人在尋找金額,那麼這是正確的方法。 –

相關問題