是否有Microsoft.SqlServer.Management.Smo.SqlDataType的替代方法,其中包含RowVersion的值?

时间:2010-03-14 18:24:30

标签: .net sql-server rowversion

Microsoft.SqlServer.Management.Smo.SqlDataType枚举的值为timestamp,但不是rowversion。我正在寻找程序集的更新版本或支持它的备用枚举类型。

现有枚举的值为Timestamp,但根据rowversion documentationtimestamp已弃用,将在以后的版本中删除“。我宁愿避免使用弃用的东西:)

2 个答案:

答案 0 :(得分: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定义中,   时间戳被定义为日期和   微软实施它的时间   作为每个都改变的二进制值   时间一排变化。微软有   警告说使用时间戳会   最终被改为坚持了   ANSI标准所以它的用途   并发管理应该是   避免。目前,时间戳和   rowversion与每个都类似   其他...

请注意,Oracle和Postgres都以符合标准的方式使用TIMESTAMP,因此微软放弃非标准时间戳的使用是为了避免让Oracle开发人员更难以尝试使用SQL Server。 / p>

无论如何,从timestamprowversion的更改仅限于名称。它不会影响使用该类型的列的行为。根据{{​​3}}的MSDN文档:

  

时间戳是该词的同义词   rowversion数据类型并受制于   数据类型同义词的行为。在   DDL语句,改为使用rowversion   时间戳尽可能。对于   更多信息,请参阅rowversion

如果你深入研究Data Type Synonyms (Transact-SQL).的文档:

  

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

换句话说,当SMO获得关于表的元数据时,它只知道rowversion。这意味着具有rowversion类型列的表将作为Data Type Synonyms

返回到SMO

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

如果您的代码显示SQL Server数据类型,您可以成为一个好公民并更改该代码以显示“rowversion”而不是“timestamp”。但是否则你的代码根本不需要改变。实际上,大多数SMO客户端(Microsoft.SqlServer.Management.Smo.SqlDataType.Timestamp)从未打扰过更改其UI以反映新命名。由于这些UI连接到封面下的枚举,因此无论SQL Server在DDL中调用哪种类型,SMO API客户端都将继续工作。

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

答案 1 :(得分:1)

我找不到任何表示不推荐使用SqlDataType.Timestamp的内容。您提供的链接表明,timestamp的“rowversion语法”在T-SQL中已弃用,您应该使用rowversion,但是要由图书馆维护人员确保在他们的产品中实现了正确的语法。如果在将来的版本中实际删除了时间戳语法,那么我确信库将被更新,Timestamp枚举值仍将向后兼容使用它的代码。由于它们不提供RowVersion枚举值,因此我只使用Timestamp