2011-06-13 61 views
10

我想開發一個模型對象來保存一個Sql Server行,我完全理解如何做到這一點,除了T-Sql/SqlServer時間戳。該表定義爲:T-Sql中的時間戳在C#中意味着什麼?

CREATE TABLE activity (
activity_id int 
, ip_address varchar(39) 
, user_id varchar(255) 
, message_text 
, dt timestamp 
) 

當我解決一個錶行到我的對象,一個int或字符串我希望做一些事情,如:

ActivityID = (int)dataReader["activity_id"]; 
IPAddress = (string)dataReader["ip_address"]; 

可是我該怎麼辦時間戳列?沒有「時間戳」數據類型,我可以在任何地方找到。我知道Sql Server將時間戳存儲爲8字節的二進制文件,但這通常與.NET中的等效內容相同?

編輯補充:有一點額外的信息......這是從我們的大型機上的DB2表返回的行,通過Sql Server視圖。 「Rowversion」不是一個選項,而DB2將該列作爲時間戳遞交。如果時間戳和rowversion是相同的,也許我可以把它當作一個,但除此之外我被卡在時間戳中。

再次編輯添加:這個項目將驅使我堅果。至少,這將是一次短暫的旅行。無論如何,是@JoelC這是一個Sql Server視圖到大型機上的DB2數據庫。我終於能夠追查到我們的一位DBA,他們蔑視地解釋說,「當然」的DB2 TIMESTAMP遇到了Sql Server視圖作爲日期時間。從他的語氣我猜,只有小菜才知道這一點。這就是爲什麼他在實際視圖中將它命名爲「日期時間」,杜! (在我的示例中,我給了它一個不同的名稱,以便不會觸發對命名約定的評論 - 實際的數據模型圖表示它是TIMESTAMP並將其命名爲時間戳)。因此,在這種情況下,顯然必須將其投射到DateTime。我想我可能會開始考慮成爲DBA,這樣我也可以讓程序員瘋狂。對不起,如果我誤導了這個問題的任何響應者 - 這是無意的,因爲我實際上期待時間戳是一個時間戳。傻我。特別要感謝微軟在與日期和時間無關時將字節數組數據類型命名爲「時間戳」。我不知道哪個回答標記爲答案。嘆。

+0

@邁克爾,這不是問什麼時候OP從數據庫

string dt = Convert.ToBase64String(dataReader["dt"] as byte[]); 

檢索時。我會用日期時間,BTW – 2011-06-13 18:49:45

+0

什麼'DateTime'對象,它可以把你的時間戳。 – Rahul 2011-06-13 18:50:19

+0

還看到:http://stackoverflow.com/questions/425389/c-equivalent-of-sql-server-2005-datatypes – 2011-06-13 18:50:44

回答

10

Sql Server時間戳數據類型的名稱令人困惑。最好把它看作更像版本號—那裏沒有任何地方有日期/時間信息。實際上,從Sql Server 2008開始,類型被重命名爲「rowversion」。

大多數情況下,您希望datetime類型的Sql Server代替C#中的DateTime,或者datetime2,如果您有支持它的Sql Server版本。上的時間戳類型文檔是在這裏:
http://msdn.microsoft.com/en-us/library/ms182776(v=sql.90).aspx

如果你真的必須映射該時間戳列,是最接近的匹配可能是普通的舊long(或者ULONG),但我不知道如何SQL Server處理字節排序或大/小端對C#。

+1

我要去紀念這是公認的答案,因爲它是響應了我認爲這個問題的正確答案。由於我的基本假設是錯誤的,這個問題變得不同了,所以在這種情況下,說DateTime的答案是正確的。 – Cyberherbalist 2011-06-13 21:35:22

13

根據this post

你必須將它轉換爲一個字節數組。

byte[] dt = dataReader["dt"] as byte[]; 
7

這是一個byte[]Length8

2

突入數據庫

new SqlParameter("@dt", Convert.FromBase64String(dt))