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

数据库版本控制

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>
 
 
功能描述: 1.业务流程更加合理、系统化 将业务流程按照部门管理职能进行划分,突破了单部门信息化处理的模式,着眼于将整个企业集 团范围内的业务流程控制更加系统化、合理化,企业运作效率因而得到最大限度的提高。 2.部门管理更具严密性、有序性 以组织机构为基础,进行工作和权限的分配,企业内部各个部门的管理职能更加清晰完整,各部 门之间通过严格的审核制度,形成紧密而连续的业务流,使企业的资金流、物流、信息流得到有 效的管理和监控,极大程度降低企业经营管理等方面的风险指数。 3.业务管理模式更加灵活、多样化 企业的业务流程各具特色,因而系统提供了可配置的业务流程模式和表单定制模式,使企业可以 根据实际情况配置业务管理流程,既可以满足企业的实际管理要求,又能够对业务流程进行监控 与跟踪。 4.统计分析功能更加丰富、实用化 系统将经营分析、财务分析、图形分析有机结合,为管理人员的决策提供了详尽的、全面的、准 确的数据资料,因而对企业经营情况一目了然,为企业的管理决策提供了充分依据。 5.预警功能更加智能化 系统可以结合采购计划、客户订单和当前库存、商品最高库存、最低库存等数据,给出真实的库 存预警报表,即时给予预警提示,确保企业生产经营正常进行。 6.零售功能强大 多种销售折扣(返点,根据不同的客户定制不同的产品销售价格),询价分析与退货方式等,还 可以对顾客不满意或有问题商品进行退货处理。 7.数据处理安全、方便 系统加强了管理业务过程中敏感数据的保密管理,保障了企业运作的商业安全。系统的自动维护 和备份功能进一步保证了数据的安全性。严谨的权限和业务流程控制可以确保数据不被伪造和篡 改,使企业领导可以充分授权。 8.办公管理趋于协同化、自动化 系统集成了企业收发文管理,加强了企业内部的沟通联系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值