C#的Version类型值与SQL Server中二进制binary类型转换

使用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

你可能感兴趣的:(MS,SQL,Server,.Net技术,.net,sql)