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

Dan*_*fer 2 .net sql-server rowversion

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

现有枚举具有值Timestamp,但根据rowversion文档,timestamp"已弃用,将在以后的版本中删除".我宁愿避免使用弃用的东西:)

Jus*_*ant 5

快速回答:

不,您不需要使用其他类型.Microsoft.SqlServer.Management.Smo.SqlDataTypedatatype是要使用的正确类型.尽管是旧式名称,Microsoft.SqlServer.Management.Smo.SqlDataType.Timestamp但是SMO为SQL Server列类型返回的值rowversion.

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

答案很长:

我将在这里结合一些引用,以避免重新发明轮子.首先,来自http://www.mssqltips.com/tip.asp?tip=1501的一些历史记录:

SQL Server 2000中引入了此数据类型[ROWVERSION],以最终替换时间戳数据类型.在ANSI-SQL定义中,时间戳被定义为日期和时间,而Microsoft将其实现为二进制值,每次行更改时都会更改.微软警告说,时间戳的使用最终将改为遵守ANSI标准,因此应避免使用它进行并发管理.目前,时间戳和rowversion都是相似的......

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

无论如何,从改变timestamprowversion仅仅是名义上的.它不会影响使用该类型的列的行为.根据MSDN文档rowversion:

timestamp是rowversion数据类型的同义词,受数据类型同义词行为的影响.在DDL语句中,尽可能使用rowversion而不是timestamp.有关更多信息,请参阅数据类型同义词(Transact-SQL).

如果你深入研究数据类型同义词的文档:

在原始对象和任何派生对象上执行的所有后续元数据函数都将报告基本数据类型,而不是同义词.元数据操作(如sp_help和其他系统存储过程),信息架构视图或报告表或结果集列的数据类型的各种数据访问API元数据操作会发生此行为.

换句话说,当SMO获得关于表的元数据时,它只知道rowversion.这意味着具有rowversion类型列的表将返回到SMO asMicrosoft.SqlServer.Management.Smo.SqlDataType.Timestamp

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

如果您的代码显示SQL Server数据类型,您可以成为一个好公民并更改该代码以显示"rowversion"而不是"timestamp".但是否则你的代码根本不需要改变.实际上,大多数SMO客户端(包括Visual Studio的表设计工具!)从未打算改变他们的UI来反映新的命名.由于这些UI连接到枚举下的枚举,因此无论SQL Server在DDL中调用哪种类型,SMO API客户端都将继续工作.

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