使用C#语言编写的应用程序可以通过.NET Framework框架提供的Version类来控制每次发布的版本号,以便更好控制每次版本更新迭代。
版本号由两到四个组件组成:主要、次要、内部版本和修订。
版本号的格式如下所示, 可选组件显示在方括号 ([ 和 ]) 中:
major.minor[.build[.revision]]
可以使用指定的主版本号、次版本号、内部版本号和修订号初始化 Version 类的新实例。
示例:
// 实例
Version(Major, Minor, Build, Revision);
/*
其中,
Marjor:主要版本号
Minor:次要版本号
Build:内部版本号
Revision:修订号
new Version(1, 0, 0, 1);
或
new Version("1.0.0.1");
*/
C# 代码片段:
/ 创建Version类对象
var version = new Version("1.0.0.1");
/* 注:使用Version类作为EF实体对象属性的类型进行映射,对应SQL Server表的字段类型为:binary(16) */
因实际业务需要将应用程序每次更新的版本号信息持久化存储在SQL Server数据库中,Entity Framework实体框架允许使用 Version类 作为属性类型直接映射。
注:Entity Framework 简称EF。
EF实体框架对映射 Version 类型值自动转换成SQL Server数据库中的固定长度(16位)二进制类型(binary)值进行存储。
对Version类型映射转换binary(16)类型值分析:
存储到SQL Server数据表中版本号值(转换后)格式:0x0000000100000000[0000000000000000]。
需要分别对每位的版本号值(十进制)进行十六进制数转换,再对每个版本号(十六进制数)组合成新的十六进行制数值。
如:
版本号:1.0.0.1
转换十六进制:
1 0 0 1
0x00000001 0x00000000 0x00000000 0x00000001
组合新的十六进制数(注:除了从左到右第一位保留"0x"十六进制前缀外,其他版本号转换都去掉前缀):
0x00000001000000000000000000000001
SQL Server 数据库没有提供C#语言Version类生成的二进制类型值(binary)的转换函数,为了实现通过编写SQL语句来插入可以互动转换Version类型的数据,自定义了版本号转换binary类型的处理函数(dbo.versionstrtobinary)。
SQL代码:
/*
功能:将版本号(如:1.0.0.1)转换为长度为 16 个字节的固定长度二进制(binary)数据处理
说明:C#开发语言使用的Version类型值(即:版本号)转换成SQL Server数据库中存储二进制类型[binary]处理
*/
IF EXISTS (SELECT * FROM sys.objects WHERE NAME='versionstrtobinary')
DROP FUNCTION dbo.versionstrtobinary;
GO
CREATE FUNCTION dbo.versionstrtobinary
(
@version varchar(max)
)
RETURNS binary(16)
AS
BEGIN
DECLARE @value int
DECLARE @bin binary(16)
DECLARE @binStr nvarchar(max)
DECLARE @minor varchar(max) -- 版本号
DECLARE @versionStr nvarchar(max) = @version;
DECLARE @j int = 1;
DECLARE @i int = 0;
set @i = CHARINDEX('.', @versionStr);
DECLARE @flag bit = 1;
WHILE @flag = 1
BEGIN
if (@i = 0)
BEGIN
SET @minor = @versionStr;
END
ELSE
BEGIN
-- 截取版本号值
set @minor = SUBSTRING(@versionStr, 1, @i-1);
END
-- 将版本号值转换为int类型
set @value = CAST(@minor as int);
-- 注:sys.fn_varbintohexsubstring()函数第1个参数表示是否保留0x前缀,1为保留,0为不保留
if (@j = 1)
BEGIN
set @binStr = sys.fn_varbintohexsubstring(1, CONVERT(VARBINARY(50), @value), 1, 0);
END
else
BEGIN
set @binStr = @binStr + sys.fn_varbintohexsubstring(0, CONVERT(VARBINARY(50), @value), 1, 0);
END
set @versionStr = SUBSTRING(@versionStr, @i+1, LEN(@versionStr) - @i);
set @i = CHARINDEX('.', @versionStr);
if (@j = LEN(@version) - 3)
BEGIN
break;
END
set @j = @j + 1;
END
set @bin = convert(binary(16), @binStr, 1); -- 如果字符串前面有0x字符,那么使用风格1(设置style=1);如果字符串前面没有0x字符,那么使用风格2(设置style=2)
RETURN @bin
END
-- 测试函数(0x00000001000000000000000000000006)
select dbo.versionstrtobinary('1.0.0.6');
-- 插入Version类型数据SQL语句
INSERT Versions (Version) VALUES (dbo.versionstrtobinary('1.0.0.1'));
GO
参考资料:
Version 类 (System) | Microsoft Learn
binary 和 varbinary (Transact-SQL) - SQL Server | Microsoft Learn