在单机软件中,如一些小型的管理软件,在发布一个版本之后,后期如果需要对软件进行升级但数据库同时也需要升级,则可以采取下面升级方案(方案不是最好的,如果有更好的欢迎指教),该解决方案可以满足需要递归升级的情况:
数据库升级必须保证只升级一遍同时把所有需要修改的字段等修改,如果发布了多个版本,则又需要进行递归升级,因而就需要记录下当前数据库升级到的版本号,如:DBVERSION = 1,此时从数据库中读取到数据库的版本号,与软件中的最新数据库版本号进行比对,如果小于当前的则需要进行升级,升级完成把数据库中记录的版本号更新为最新的版本号,因此下次再启动时发现数据库版本号和软件中记录的版本号相同则不再进行升级操作。
const
DBVERSION = 1;
procedure TFmMain.UpgradeDB;
var
sUpdate:string;
iDBVersion: integer;
bUpgradeSuccess: boolean;
begin
//G_Config.iDBVersion为读取到的数据库中保存的数据库版本号,默认为0
if G_Config.iDBVersion>=DBVERSION then //如果数据库中记录的版本号大于等于软件版本号则直接退出
exit;
bUpgradeSuccess := true;
for iDBVersion := (G_Config.iDBVersion+1) to DBVERSION do
begin
case iDBVersion of
1: //rtCustomer表中sTel、sTel1、sTel2、sTel3、sTel4默认值修改为''
begin
sUpdate := 'alter table rtCustomer alter column sTel TEXT(20) default ""';
bUpgradeSuccess := DMMain.ExecCmd(sUpdate); //执行更新的SQL语句
if bUpgradeSuccess=false then
break; //如果执行错误则退出升级
sUpdate := 'alter table rtCustomer alter column sTel1 TEXT(20) default ""';
bUpgradeSuccess := DMMain.ExecCmd(sUpdate);
if bUpgradeSuccess=false then
break;
end;
end;
end;
if bUpgradeSuccess then //更新成功
begin
G_Config.iDBVersion := DBVERSION;
//把最新的数据库版本号写入到数据库中保存
end //更新失败
else
begin
if iDBVersion>DBVERSION then
iDBVersion := DBVERSION;
if G_Config.iDBVersion<iDBVersion-1 then
begin
G_Config.iDBVersion := iDBVersion-1;
//把最新的数据库版本号写入到数据库中保存
end;
end;
end;