解析大型.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>
解析大型.NET ERP系统 版本控制的更多相关文章
- 解析大型.NET ERP系统 十三种界面设计模式
成熟的ERP系统的界面应该都是从模板中拷贝出来的,各类功能的界面有规律可遵循.软件界面设计模式化或是艺术性的创作,我认可前者,模式化的界面客户容易举一反三,降低学习门槛.除了一些小部分的功能界面设计特 ...
- 解析大型.NET ERP系统 设计异常处理模块
异常处理模块是大型系统必备的一个组件,精心设计的异常处理模块可提高系统的健壮性.下面从我理解的角度,谈谈异常处理的方方面面.我的设计仅仅限定于Windows Forms,供参考. 1 定义异常类型 . ...
- 解析大型.NET ERP系统架构设计 Framework+ Application 设计模式
我对大型系统的理解,从数量上面来讲,源代码超过百万行以上,系统有超过300个以上的功能,从质量上来讲系统应该具备良好的可扩展性和可维护性,系统中的功能紧密关联.除去业务上的复杂性,如何设计这样的一个协 ...
- 解析大型.NET ERP系统 权限模块设计与实现
权限模块是ERP系统的核心模块之一,完善的权限控制机制给系统增色不少.总结我接触过的权限模块,以享读者. 1 权限的简明定义 ERP权限管理用一句简单的话来说就是:谁 能否 做 那些 事. 文句 含义 ...
- 解析大型.NET ERP系统 通用附件管理功能
大型系统具备一个通用的附件管理功能,对于单据中无法清晰表达的字段,用一个附件图片或附件文档表示是最好的方法了.比如物料清单附加一张CAD图纸,销售订单评审功能中附加客户的各种表格,通用附件功能对系统起 ...
- 解析大型.NET ERP系统 20条数据库设计规范
数据库设计规范是个技术含量相对低的话题,只需要对标准和规范的坚持即可做到.当系统越来越庞大,严格控制数据库的设计人员,并且有一份规范书供执行参考.在程序框架中,也有一份强制性的约定,当不遵守规范时报错 ...
- 解析大型.NET ERP系统 单据编码功能实现
单据编码是ERP系统中必备的功能,用于生成各种单据的流水号,常常借助于日期时间等字符来生成一个唯一的单据号码.从软件的角度来说,就是为生成数据表的主键值(参考编号),从用户的角度来说,就是给业务单据制 ...
- 解析大型.NET ERP系统 单据标准(新增,修改,删除,复制,打印)功能程序设计
ERP系统的单据具备标准的功能,这里的单据可翻译为Bill,Document,Entry,具备相似的工具条操作界面.通过设计可复用的基类,子类只需要继承基类窗体即可完成单据功能的程序设计.先看标准的销 ...
- 解析大型.NET ERP系统 业务逻辑设计与实现
根据近几年的制造业软件开发经验,以我开发人员的理解角度,简要说明功能(Feature)是如何设计与实现的,供参考. 因架构的不同,技术实现上会有所差异,我的经验仅限定于Windows Form程序. ...
随机推荐
- .net点选验证码实现思路分享
哈哈好久没冒泡了,最进看见点选验证码有点意思,所以想自己写一个. 先上效果图 如果你被这个效果吸引了就请继续看下去. 贴代码前先说点思路: 1.要有一个汉字库,并按字形分类.(我在数据库里是安部首分类 ...
- MVVM模式解析和在WPF中的实现(三)命令绑定
MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- iOS热更新-8种实现方式
一.JSPatch 热更新时,从服务器拉去js脚本.理论上可以修改和新建所有的模块,但是不建议这样做. 建议 用来做紧急的小需求和 修复严重的线上bug. 二.lua脚本 比如: wax.热更新时,从 ...
- CENTOS 6.5 平台离线编译安装 Mysql5.6.22
一.下载源码包 http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.22.tar.gz 二.准备工作 卸载之前本机自带的MYSQL 安装 cmake,编 ...
- java 利用ManagementFactory获取jvm,os的一些信息--转
原文地址:http://blog.csdn.net/dream_broken/article/details/49759043 想了解下某个Java项目的运行时jvm的情况,可以使用一些监控工具,比如 ...
- 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型
前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...
- background例子
- 太多选择——企业如何选择合适的BI工具?
在没认清现状前,企业当然不能一言不合就上BI. BI不同于一般的企业管理软件,不能简单归类为类似用于提高管理的ERP和WMS,或用于提高企业效率的OA.BPM.BI的本质应该是通过展现数据,用于加强企 ...
- VS2015墙内创建ionic2 【利用nrm更换源,完美!】
STEP 1 设置cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org 一句话建立cnpm STEP 2 安装nr ...
- Linux学习
Linux 命令英文全称su:Swith user 切换用户,切换到root用户cat: Concatenate 串联uname: Unix name 系统名称df: Disk free 空余硬盘du ...