1) 開發版本控制。控制多人同時修改數據庫產生的衝突,使用SQL Source Control 工具作版本管理。html
SQL Server Management Studio支持VSS和TFS等做爲數據庫腳本的版本控制工具。sql
關於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。ui
數據庫中的版本表定義以下,包含版本名稱和升級日期:
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>