原文出处(我的网站,这里是备份) --
[SQL Server]时间戳记。 timestamp与 rowversion数据型态
http://www.dotblogs.com.tw/mis2000lab/archive/2011/04/26/sql_timestamp_rowversion_20110426.aspx
[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时,您必须指定一个 [数据行(字段)名称]。
....................................................................................................寄信给我 mis2000lab (at)雅虎.com.台湾 ........
ASP.NET案例精编(清华大学出版社 / 作者MIS2000Lab)
http://www.china-pub.com/46063
2009/5/15上市
市场价 :¥59.80 RMB(人民幣)
