Valor de tipo de versión de C# y conversión de tipo binario binario en SQL Server

Las aplicaciones escritas en lenguaje C# pueden controlar el número de versión de cada lanzamiento a través de la clase Version proporcionada por el marco .NET Framework, para controlar mejor cada iteración de actualización de versión.

Los números de versión constan de dos a cuatro componentes: mayor, menor, compilación y revisión .

El formato del número de versión es el siguiente, con los componentes opcionales que se muestran entre corchetes ([ y ]):

mayor.menor[.compilación[.revisión]]

Se puede inicializar   una nueva instancia de la clase Version con el número de versión principal, el número de versión secundaria, el número de compilación y el número de revisión especificados.

Ejemplo:

// 实例
Version(Major, Minor, Build, Revision);

/*
其中, 
Marjor:主要版本号
Minor:次要版本号
Build:内部版本号
Revision:修订号

new Version(1, 0, 0, 1); 
或
new Version("1.0.0.1");
*/

Fragmento de código C#:

/ 创建Version类对象
var version = new Version("1.0.0.1");

/* 注:使用Version类作为EF实体对象属性的类型进行映射,对应SQL Server表的字段类型为:binary(16) */

Debido a que el negocio real necesita almacenar de manera persistente la información del número de versión de cada actualización de la aplicación en la base de datos de SQL Server, el marco de entidades de Entity Framework permite el mapeo directo usando la clase Version como un tipo de atributo.

Nota: Entity Framework se llama EF para abreviar.

EF Entity Framework convierte automáticamente el valor del tipo de versión de asignación en un valor de tipo binario (binario) de longitud fija (16 bits) en la base de datos de SQL Server para el almacenamiento.

Análisis de conversión de valor de tipo binario (16) para el mapeo de tipo de versión:

El valor del número de versión almacenado en el formato de la tabla de datos de SQL Server (después de la conversión): 0x00000001 00000000 [00000000 00000000 ].

Es necesario realizar una conversión de número hexadecimal en el valor del número de versión (decimal) de cada bit y luego combinar cada número de versión (número hexadecimal) en un nuevo valor hexadecimal.

como:

Número de versión: 1.0.0.1

Convertir hexadecimal:

       1 0 0 1

0x00000001 0x00000000 0x00000000 0x00000001

Combine nuevos números hexadecimales ( Nota: Excepto por el primer dígito de izquierda a derecha para conservar el prefijo hexadecimal "0x", otras conversiones de números de versión eliminarán el prefijo ):

0x00000001 00000000 00000000 00000001

La base de datos de SQL Server no proporciona la función de conversión del valor de tipo binario (binario) generado por la clase de versión del lenguaje C. Para realizar la inserción de datos que pueden convertir de forma interactiva el tipo de versión al escribir declaraciones SQL , un número de versión personalizado función de procesamiento de conversión de tipo binario (dbo .versionstrtobinary).

código 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

Referencias:

Clase de versión (Sistema) | Microsoft Learn

binario 和 varbinary (Transact-SQL) - SQL Server | aprender

Supongo que te gusta

Origin blog.csdn.net/LZD_jay/article/details/129329610
Recomendado
Clasificación