T-Sql中的时间戳在C#中是什么意思?

19

我正在尝试开发一个模型对象来保存Sql Server中的一行数据,除了T-Sql/SqlServer时间戳之外,我对如何做到这一点非常清楚。表定义如下:

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

当我将表格行解析为对象时,对于整数或字符串,我期望做如下操作:

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

那么时间戳列应该怎么处理呢?我找不到任何“时间戳”数据类型。我知道Sql Server将时间戳存储为8字节二进制,但在.NET中通常等价于什么?

编辑:加一点额外信息...这是从我们的主机上的DB2表返回的一行,通过Sql Server视图进行传递。“Rowversion”不是选项,而且DB2将该列作为时间戳处理。如果时间戳和Rowversion是相同的,那么我可以将其视为一个,否则我只能使用时间戳。

再次编辑以添加: 这个项目会让我疯掉。 至少,它将是一个短暂的旅程。 无论如何,是的@JoelC这是一个针对主机上的DB2数据库的Sql Server视图。 我最终能够追踪到我们的其中一位DBA,他不屑地解释说,“当然”,DB2时间戳会被传递为Sql Server视图中的日期时间。从他的语气中我想,只有新手才不知道这一点。这就是为什么他在实际视图中将其命名为“datetime”。(我在我的示例中给它起了一个不同的名称,以避免触发有关命名约定的评论 - 实际数据模型图表明它是时间戳并将其命名为timestamp)。因此,在这种情况下,显然必须将其转换为DateTime。我想我可能要考虑成为一个DBA,这样我也可以让程序员发疯。如果我误导了任何问题的回答者,请原谅我 - 这是无意中的,因为我实际上预计时间戳会是一个时间戳。我真傻。尤其感谢微软将一个字节数组数据类型命名为“时间戳”,而它与日期和时间无关。 我没有最微小的想法该标记哪个答案。叹气。


@Michael,这不是OP所问的。顺便说一下,我会使用DateTime。 - Adriano Carneiro
DateTime对象怎么样?它可以保存您的时间戳。 - Rahul
请参见:https://dev59.com/knRC5IYBdhLWcg3wD8tV - George Stocker
4
您应该使用rowversion而不是timestamp - 请参阅http://msdn.microsoft.com/en-us/library/ms182776.aspx。 - Steve Townsend
如果我有数据库的控制权,那是非常好的建议,但事实上我没有。这实际上是通过 Sql Server 视图传递的 DB2 表。 - Cyberherbalist
@Cyber,你是如何将DB2数据库导入SQL中的?在视图中可以更改列的数据类型吗?我认为DB2的时间戳不应该映射到SQL Server的时间戳,因为它们的含义不同。 - Joel C
4个回答

20
此帖子所述,您需要将其强制转换为字节数组。
byte[] dt = dataReader["dt"] as byte[];

15

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如何处理字节顺序或大/小端序与C#之间的关系。


1
我将把这个回答标记为接受的答案,因为它是针对我所认为的问题的正确答案。由于我的基本假设是错误的,问题已经变得不同,因此在那种情况下,将其强制转换为DateTime的答案是正确的。 - Cyberherbalist

11

这是一个byte[],长度为8


6

当从数据库检索数据时

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

当将数据传递到数据库中时

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接