解析大型.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程序. ...
随机推荐
- 写出易调试的SQL(修订版)
h4 { background: #698B22 !important; color: #FFFFFF; font-family: "微软雅黑", "宋体", ...
- 【Win 10 应用开发】启动远程设备上的应用
这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...
- 【原】AFNetworking源码阅读(六)
[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...
- WebApi接口 - 响应输出xml和json
格式化数据这东西,主要看需要的运用场景,今天和大家分享的是webapi格式化数据,这里面的例子主要是输出json和xml的格式数据,测试用例很接近实际常用情况:希望大家喜欢,也希望各位多多扫码支持和点 ...
- python笔记(持续更新)
1.编译python遇到下面的编码问题: SyntaxError: Non-ASCII character '\xe9' in file E:\projects\learn.py on lin ...
- js学习之函数的参数传递
我们都知道在 ECMAScript 中,数据类型分为原始类型(又称值类型/基本类型)和引用类型(又称对象类型):这里我将按照这两种类型分别对函数进行传参,看一下到底发生了什么. 参数的理解 首先,我们 ...
- 【算法】(查找你附近的人) GeoHash核心原理解析及代码实现
本文地址 原文地址 分享提纲: 0. 引子 1. 感性认识GeoHash 2. GeoHash算法的步骤 3. GeoHash Base32编码长度与精度 4. GeoHash算法 5. 使用注意点( ...
- arcgis api for js入门开发系列六地图分屏对比(含源代码)
上一篇实现了demo的地图标绘模块,本篇新增地图地图分屏对比模块,截图如下(源代码见文章底部): 对效果图的简单介绍一下,在demo只采用了两分屏对比,感兴趣的话,可以在两分屏的基础上拓展,修改css ...
- Java 进阶 hello world! - 中级程序员之路
Java 进阶 hello world! - 中级程序员之路 Java是一种跨平台的语言,号称:"一次编写,到处运行",在世界编程语言排行榜中稳居第二名(TIOBE index). ...
- Git(1)
安装Git 完毕 (在开始菜单打开的话,打开的不是你想要的路径,切换路径很麻烦) 1.D盘新建 GitTest 文件夹 2.打开GitTest , 在空白的地方右键, 3.单击 Git Bash He ...