T-Sql中的时间戳在C#中意味着什么?

时间:2011-06-13 18:47:03

标签: c# sql-server tsql db2

我正在尝试开发一个模型对象来保存一个Sql Server行,我完全理解除T-Sql / SqlServer时间戳之外的其他方法。该表定义为:

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"];

但是我如何处理时间戳列?我可以在任何地方找到没有“timestamp”数据类型。我知道Sql Server将时间戳存储为8字节的二进制文件,但这通常与.NET中的相同?

编辑添加:一些额外的信息......这是从我们的大型机上的DB2表通过Sql Server视图返回的一行。 “Rowversion”不是一个选项,DB2正在将列作为时间戳处理。如果timestamp和rowversion相同,也许我可以将它视为一个,但否则我会遇到时间戳。

再次编辑添加:这个项目将让我疯狂。它至少会是一次短途旅行。无论如何,是的@JoelC这是一个Sql Server视图,进入大型机上的DB2数据库。我终于能够找到我们的一位DBA,他们轻蔑地解释说“当然”DB2 TIMESTAMP在Sql Server视图中遇到日期时间。根据他的语调,我猜只有新手不知道这一点。这就是为什么他在实际视图中将其命名为“datetime”,Duh! (我在我的示例中给它一个不同的名称,以便不触发对命名约定的评论 - 实际的数据模型图表示它是TIMESTAMP并将其命名为时间戳)。所以,在这种情况下,显然必须将其转换为DateTime。我想我可能会开始考虑成为一名DBA,这样我也可以让程序员疯狂。对不起,如果我误导了这个问题的任何响应者 - 这是无意的,因为我实际上期待时间戳是一个时间戳。傻我。特别感谢Microsoft将字节数组数据类型命名为“时间戳”,因为它与日期和时间无关。我没有最简单的想法,哪个回应标记为答案。叹息。

4 个答案:

答案 0 :(得分:15)

根据this post

你必须将其转换为字节数组。

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

答案 1 :(得分:13)

Sql Server时间戳数据类型的名称令人困惑。最好把它想象成一个版本号 - 那里没有日期/时间信息。事实上,从Sql Server 2008开始,该类型被重命名为“rowversion”。

大多数情况下,您希望在SQL Server中使用datetime类型,它可以轻松映射到C#中的DateTime,如果您有一个支持它的Sql Server版本,则可能datetime2。有关时间戳类型的文档如下:
http://msdn.microsoft.com/en-us/library/ms182776(v=sql.90).aspx

如果你真的必须按原样映射该时间戳列,那么最接近的匹配可能是普通的long(或者可能是ulong),但我不知道sql server如何处理字节排序或大/小endien- ness vs C#。

答案 2 :(得分:8)

这是byte[]Length8

答案 3 :(得分:3)

从数据库中检索时

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

传入数据库时​​

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