解析大型.NET ERP系统 版本控制

avatar 2020年5月18日15:08:09 评论 116

数据库版本控制

1) 开发版本控制。控制多人同时修改数据库产生的冲突,使用SQL Source Control 工具做版本管理。

SQL Server Management Studio支持VSS和TFS等作为数据库脚本的版本控制工具。

关于SQL Source Control,参考以下地址 http://www.red-gate.com/products/sql-development/sql-source-control/

2) 部署版本控制。将所有涉及数据库表结构变动的地方保存为SQL语句,依次用文件编号顺序编写。

比如,系统参数表增加一个文件传输方式的字段,参考下面的脚本:

--文件传输模式 XCOPY,FTP,HTTP
IF NOT EXISTS(SELECT C.NAME FROM DBO.SYSCOLUMNS C, DBO.SYSOBJECTS O WHERE O.ID = C.ID AND O.NAME = 'CompanyParameter' AND  C.NAME = 'FileTransmissionMode')
BEGIN
    Alter Table CompanyParameter ADD FileTransmissionMode nvarchar(1) NULL
END
GO

将这些积累起来的数据变更脚本DML保存到一个带版本编号的SQL文件中,比如REV1710.sql。1710表示版本号,它的文件内容应该是这样的:

EXEC  CheckVersion  'REV1710'
Go

--文件传输模式 XCOPY,FTP,HTTP
IF NOT EXISTS(SELECT C.NAME FROM DBO.SYSCOLUMNS C, DBO.SYSOBJECTS O WHERE O.ID = C.ID AND O.NAME = 'CompanyParameter' AND  C.NAME = 'FileTransmissionMode')
BEGIN
    Alter Table CompanyParameter ADD FileTransmissionMode nvarchar(1) NULL
END
GO

EXEC  UpdateVersion  'REV1710'
Go

这个文件的设计模式包含三部分内容:

1) 检查版本,检测当前数据库的版本是否是REV1709,不允许跳过版本升级。

2) 执行更新语句,更新数据库。

3) 修改当前数据库的版本为REV1710。

数据库中的版本表定义如下,包含版本名称和升级日期:

CREATE TABLE [dbo].[Version](
[Recnum] [DECIMAL](18, 0) IDENTITY(1,1) NOT NULL,
[Version] [NVARCHAR](8) NOT NULL,
[ApplyDate] [DATETIME](50) NULL
 CONSTRAINT [PK_AgentConfiguration] PRIMARY KEY CLUSTERED 
(
    [Version] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

程序版本控制

定义一个版本常量类型,用于所有程序集共享此版本变量。

public sealed class AssemblyVersion
{
       public const string Major = "2";
       public const string Minor = "4";
       public const string Build = "0";
       public const string Revision = "0";

       public const string Version = Major + "." + Minor + "." + Build + "." + Revision;
}

修改所有项目的版本信息文件AssemblyInfo.cs,设置版本信息为定义的常量值。

[assembly: System.Reflection.AssemblyFileVersion(AssemblyVersion.FileVersion)]
[assembly: System.Reflection.AssemblyVersion(AssemblyVersion.Version)]

1 在程序启动时,检查程序当前目录中的程序集版本,发现不一致的程序集则应该抛出异常,停止启动程序。

private static void VerifyAssembliesVersion()
{
        string[] files = Directory.GetFiles(Application.StartupPath, "Enterprise.*.dll", SearchOption.TopDirectoryOnly);
        Parallel.ForEach<string>(files, file =>
        {
                FileVersionInfo fileVersion = FileVersionInfo.GetVersionInfo(file);
              
                 if (string.CompareOrdinal(fileVersion.FileVersion, AssemblyVersion.FileVersion) != 0)
                 {
                       throw new AppException(string.Format("File version mismatch detected\r\nFile: {0}\r\nRequired Version: {1}\r\nCurrent Version: {2}",
                           new object[] { file.Replace(Application.StartupPath + "\\", ""), AssemblyVersion.FileVersion, fileVersion.FileVersion }));
                 }               
         });
}

2  登入时,检测客户端程序的版本是否与服务器端的版本一致。C/S架构的程序,Client登入操作要判断Server端版本是否一致,不一致需要抛出异常,终止登入。

3  功能的窗体基类检查版本,在这里也可以做与版本相关的签名判断。

private void VerifyAssembly()
{
     //System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
      startIndex = fullName.LastIndexOf("Version");
      version = fullName.Substring(startIndex, 15);
      versionNumber = str.LastIndexOf("Version");
      str = str.Substring(num2, 15);
      startIndex = fullName.LastIndexOf("PublicKeyToken");
      publickToken = fullName.Substring(startIndex, 31);
      num2 = str.LastIndexOf("PublicKeyToken");
      publickToken = str.Substring(num2, 31); 
}

取出程序集的全名(Assembly.GetCallingAssembly().FullName),逐个字符串判断版本是否一致。

 

4 对于特殊类型的程序集,比如工作流,.NET CLR程序集,版本保持为永久一致。这两种类型的程序集需要序列化并存储到数据库中,当程序集在更新版本时,这类数据不会被修改。如果版本有变化,会导致找不到程序集错误。

<WorkflowEntity WorkflowName="WFI001" Assembly="BusinessLogic, Version=5.5.0.0, Culture=neutral, PublicKeyToken=ea0fbbdb0910eab3" Type="BusinessLogic.EntityClasses.WorkflowEntity"><Fields><WorkflowName><CurrentValue Type="System.String">WFI001</CurrentValue><DbValue Type="System.String">WFI001</DbValue><IsChanged>False</IsChanged><IsNull>False</IsNull></WorkflowName><Description><CurrentValue Type="System.String">本日安全库存量</CurrentValue><DbValue Type="System.String">本日安全库存量</DbValue><IsChanged>False</IsChanged><IsNull>False</IsNull></Description><TableName><CurrentValue Type="System.String"></CurrentValue><DbValue Type="System.String"></DbValue><IsChanged>False</IsChanged><IsNull>False</IsNull></TableName><WorkflowType>

在这个工作流定义中(XOML),版本是5.5.0.0,当升级到新的工作流版本后加载此工作流定义文件(XOML)会报错。
BusinessLogic, Version=5.5.0.0, Culture=neutral, PublicKeyToken=ea0fbbdb0910eab3

.NET CLR开发的SQL Server程序集也应按遵循此方法,使用固定的版本号。

5  不同的.NET编译版本,需要附带相应的程序集缓存或安装工具。

InstallUtil.exe  用于安装.NET程序集到系统服务中。

GACUTIL.EXE 用于将.NET程序安装到系统全局缓存中。

可以通过配置文件在运行时将旧版本的文件重定向到新版本,参考下面的配置节。

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
             <assemblyIdentity name="ICSharpCode.SharpZipLib" publicKeyToken="1B03E6ACF1164F73" culture="neutral"/>
                <bindingRedirect oldVersion="0.0.0.0-0.86.0.518" newVersion="0.86.0.518"/>
            </dependentAssembly>
    </assemblyBinding>
 </runtime>
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: