MIS2000 Lab. -- ASP.NET学习&分享 / ASP.NET案例精编(清华大学出版社)
您好,我来自台湾。很高兴与各位分享一些成果。希望对您有帮助。出版书籍是「ASP.NET案例精编 / 清华大学出版社」。

原文出处(我的网站,这里是备份) --
[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时,您必须指定一个 [数据行(字段)名称]



posted on 2011-04-26 15:24  MIS2000 Lab.  阅读(1460)  评论(0)    收藏  举报


ASP.NET案例精编——适用于VS 2005/2008(配光盘)
 

当当网购买 http://product.dangdang.com/product.aspx?product_id=20583373&ref=search-1-pub