2010-03-14 61 views
2

Microsoft.SqlServer.Management.Smo.SqlDataType枚举的值为timestamp类型,但不是rowversion。我正在寻找程序集的更新版本或支持它的替代枚举类型。是否有包含RowVersion值的Microsoft.SqlServer.Management.Smo.SqlDataType的替代方法?

现有枚举的值为Timestamp,但根据rowversion documentation,timestamp是“不推荐使用,将在未来版本中删除”。我更喜欢避免使用已弃用的东西:)

+1

RowVersion = TimeStamp - 你不能只使用TimeStamp数据类型吗? – 2010-03-14 21:39:14

回答

5

快速回答:

不,你并不需要使用另一种类型。数据类型Microsoft.SqlServer.Management.Smo.SqlDataType是使用的正确类型。尽管使用旧式名称,Microsoft.SqlServer.Management.Smo.SqlDataType.Timestamp是SMO为rowversion类型的SQL Server列返回的值。

什么是不推荐使用SQL Sever DDL语句中的类型名称“timestamp”。如果您的代码生成包含类型名称timestamp的DDL语句并将它们发送到SQL Server,则应该更改代码以使用[rowversion][4]。但是,如果您只是使用SMO或使用Microsoft.SqlServer.Management.Smo.SqlDataType类型的任何类型,则不会受服务器端名称更改影响。

龙答:

我要去几个报价在这里结合,以避免重新发明轮子。首先,从http://www.mssqltips.com/tip.asp?tip=1501一些历史:

这种数据类型[ROWVERSION]是 在SQL Server 2000中引入到 最终取代时间戳数据 类型。在ANSI-SQL定义中, 时间戳定义为日期和 时间,而Microsoft将其实现为 作为二进制值,每更改一行就会更改一次 。微软有 警告说,使用时间戳将最终改变为遵守 ANSI标准,因此其使用 并发管理应该是 避免。目前,无论时间戳和 rowversion类似于每个 其他...

注意,Oracle和Postgres都使用TIMESTAMP在符合标准的方式,所以这是一个明智的举动被微软抛弃非标准使用时间戳来避免让Oracle开发人员尝试在SQL Server上工作变得更加困难。

无论如何,从timestamprowversion的变化只是名义上的。它不会影响使用该类型的列的行为。每MSDN文档的rowversion

时间戳的 rowversion数据类型的同义词,并受 数据类型同义词的行为。在 DDL语句中,尽可能使用时间戳的rowversion代替 。对于 更多信息,请参阅Data Type Synonyms (Transact-SQL).

如果你深入到文档的Data Type Synonyms

随后的所有元数据功能 原始对象和 上执行任何派生的对象将报告 基本数据类型,而不是同义词。用元数据时发生此 行为 操作,如sp_help和其他 系统存储过程,所述 信息模式视图,或 各种数据访问API元数据 操作该报告表的数据类型 或结果集的列。

换句话说,在SMO获取关于表的元数据时,它只知道rowversion。这意味着列的rowversion类型的表正在返回到SMO,因为Microsoft.SqlServer.Management.Smo.SqlDataType.Timestamp

SMO API从未赶上SQL Server使用的新命名。但是因为该类型的底层行为没有改变,只有名称,您的SMO客户端代码不需要更改。

如果您的代码显示SQL Server数据类型,您可以成为一个好公民,并更改该代码以显示“rowversion”而不是“timestamp”。但是否则你的代码根本不需要改变。实际上,大多数SMO客户(including Visual Studio's table design tool!)甚至从来不会改变他们的UI来反映新的命名。由于这些UI连接到封面上的枚举,SMO API客户端将继续工作,而不管SQL Server如何在DDL中调用该类型。

SMO API的未来版本可能也会为具有相同基础数值的枚举(例如Microsoft.SqlServer.Management.Smo.SqlDataType.RowVersion)添加一个同义值,但考虑到现有客户端未被破坏,这可能是低优先级他们。

+0

+1,综合答案 – gbn 2010-03-19 20:55:09

1

我找不到任何表明SqlDataType.Timestamp已弃用的内容。您提供的链接表明rowversion的“timestamp语法”在T-SQL中已被弃用,您应该使用rowversion来代替,但这取决于库维护人员以确保在其产品中实现了正确的语法。如果在未来的版本中实际上删除了时间戳语法,那么我相信该库将被更新,并且枚举值对于使用它的代码仍然是向后兼容的。由于它们不提供枚举值RowVersion,所以我只使用Timestamp

相关问题