Code Bye

讨教关于管理类软件升级问题

本人有一个小管理软件,用C#开发。数据库使用MS SQL。
WinForm C/S 方式,服务端和客户端通过SOCKET通信。
服务端和数据库是用存储过程方式操作。
本人想问一下,现在第一个版本在使用,部署了5台电脑当服务器在用。
本人现在继续开发,添加了些功能,在数据库里添加了一些表,在原有的表里有些修改了字段和添加了一些字段。
问一下一下各位高手,像这种情况,本人要怎么对这5台已经在运行的服务器数据库升级,一台一台去改字段或添加表不现实啊。
有没有好的方式,或开发的时候就应该选择哪种模式或开发工具。
求高手指点。
解决方案

20

更改数据库可以使用 DDL。例如 create table……、alter table…add column……、alter table…. add index …… 等等。
升级数据库应该是应用程序“自动”的行为。很显然,那些只会手动去操作的人,可能是原因是“少见”的原因,也可能是别人已经教了但是他对 sql 的能力根本看不懂 DDL 的程度。只要你平常习惯于使用 DDL 方式(也就是写一个脚本文件方式)来自动升级数据库,那么应用程序中自动升级,也是顺理成章很容易做到的。
在应用程序中,作为资源文件,你应该分别为数据库的每一次升级单独保存一个脚本文件。然后应用程序在每一次启动时,首先检测数据库的升级版本(例如在数据库中某个表或应用程序的本地某个配置文件中记录版本号,假如没有则默认为0版本)。
例如检测出升级版本是10,而现在的应用程序可找到11、12、13、14、15 共5个DDL 脚本文件,那么应用程序应该按照顺序分别运行11、12、13、14、15 升级脚本,不可跳过。切记不可跳过。
每当升级成功一个版本,例如11版本升级成功,就要先记录这个版本号,然后再开始升级12版本。使得升级过程不需要重复。
但是要考虑到升级到一半出错,以后又重新开始升级的问题(要作出假设、并测试)。所以例如你写  alter table…add column …..,这是不够的,而应该写为  if not exist(select * from sys…..先判断目标表中能否目标字段) alter table …. add column ……。也就是全部的 DDL 语句应该都有一个 if 判断。
总之一句话:一个成熟的软件是应用程序自动升级数据库的。不是手工操作的。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明讨教关于管理类软件升级问题