時間戳記。 timestamp與 rowversion資料型態 

這是顯示在資料庫內自動產生的 "唯一"二進位數字(Byte[])的資料類型。rowversion通常用來做為版本戳記資料表資料列的機制。儲存體大小是 8 位元組。rowversion資料類型只是會遞增的數字,因此不會保留日期或時間。



 


[SQL Server]時間戳記。 timestamp與 rowversion資料型態

SQL 2005 -- timestamp
http://msdn.microsoft.com/zh-tw/library/ms182776(v=SQL.90).aspx

微軟的建議 -- timestamp 語法已被取代。未來的 Microsoft SQL Server 版本將移除這項功能。
                          請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。



SQL 2008起 -- rowversion
http://msdn.microsoft.com/zh-tw/library/ms182776(v=SQL.100).aspx

 

 


所謂的「時間戳記」,並 "不"是記錄一段日期與時間。

而是隨著時間變化,遞增這個時間戳記而已。
 

透過這個特性,

您在更新(Update)數據時,可以事先檢查這一筆記錄,
是否在您修改之前,已經被人更動過了。

 

在 SQL Server裡面查詢。
最後一個欄位就是採用 timestamp時間戳記

1    test111(修改後)           2011-04-26 14:42:00    0x000000000000DDEE
2    test222(修改後)          2011-04-23 00:00:00    0x000000000000DDE8
3    test333                             2011-04-24 00:00:00    0x000000000000DDE3
4    test444                              2011-04-25 00:00:00    0x000000000000DDE4
 

 

一旦您修改 (Update) 了某一列記錄(如:id=1這筆記錄)

時間戳記就會自動變成  0x000000000000DDE5 (......以此類推)
 


但是,程式無法把 timestamp呈現出來(直接呈現在畫面上)。

所以,您可能要採用這種兩方式稍作改寫:

======================================================================================

        Dim s As String = New UTF8Encoding().GetString(dr.GetSqlBinary(3).Value)
        Response.Write("test_timestamp(時間戳記) -- " & s & "<hr /><br />")
       '-- 這種字串,呈現在畫面上會變成亂碼。



======================================================================================
或是

(這段作法我試過,成功。但轉換出來的字串,跟原本資料表的 timestamp內容,有一點差異。)


        Dim SB As New StringBuilder()
        
        For i As Integer = 0 To (dr.GetSqlBinary(3).Length - 1)
            SB.Append(dr.GetSqlBinary(3).Item(i))
        Next
        
        Label1.Text = "test_timestamp(時間戳記) -- " & SB.ToString() & "<hr />"


        
        
 其中的 dr代表 DataReader
 dr.GetSqlBinary(3) 。   3代表第四個欄位(資料行 / Column)名稱     。

 這都是基礎 ADO.NET的用法。  
        

 

 

以下是微軟 MSDN網站的說明,寫得很詳細 (部分節錄如下)

這是顯示在資料庫內自動產生 "唯一"二進位數字(Byte[])的資料類型。rowversion通常用來做為版本戳記資料表資料列的機制。儲存體大小是 8 位元組。rowversion資料類型只是會遞增的數字,因此不會保留日期或時間。若要記錄日期或時間,請使用 datetime2資料類型。

每個資料庫都有一個計數器,會針對在資料庫內包含 rowversion資料行的資料表所執行的每個插入或更新作業而累加。這個計數器是資料庫資料列版本。這會追蹤資料庫內的相對時間,而不是可關聯於時鐘的實際時間。資料表只能有一個 rowversion資料行。
每次修改或插入含 rowversion資料行的資料列時,都會在 rowversion資料行中插入累加的資料庫資料列版本值。

不可為 Null 的rowversion資料行,語意等於 binary(8) 資料行。
可為 Null 的 rowversion資料行,語意等於 varbinary(8)資料行。


如果您沒有指定資料行(欄位)名稱,Microsoft SQL Server 2005 Database Engine會產生 timestamp資料行名稱;不過,rowversion同義字不會遵照這個行為。

當您使用 rowversion時,您必須指定一個 [資料行(欄位)名稱]。

 

 

注意 !!   rowversion 欄位,  該欄位不建議成為索引鍵值

http://blogs.technet.com/b/technet_taiwan/archive/2015/01/16/tsql-series-0116.aspx

 

相關文章:

[MSDN] 如何寫出高效能 T-SQL

 

寫信給我--  mis2000lab (at) yahoo.com.台灣  或是  school (at) mis2000lab.net

................   facebook社團   https://www.facebook.com/mis2000lab   ......................

................   Google+   https://plus.google.com/100202398389206570368/posts ........

................  YouTube (ASP.NET) 線上教學影片  http://goo.gl/rGLocQ

*********************************************************************************************

*** 第一天 的 ASP.NET MVC線上課程 免費看(5.5小時)*** 

************************************************************(歡迎索取,免費申請)*****

 
創作者介紹
創作者 MIS2000 Lab 的頭像
MIS2000 Lab

MIS2000 Lab -- ASP.NET專題實務 / 線上教學文件

MIS2000 Lab 發表在 痞客邦 留言(0) 人氣()