嘻嘻,我做过了,超好用。用sql语句更新结构!!
在自己的库里建一个 dbver表。里面填入对应程序的版本号(程序一定要加版本号哦)
程序每次运行时,读出自身的版本号,然后跟dbver里的值进行对照(无此表当然是1.0啦),发现大于dbver里的,就执行从dbver里的版本到自身版本号中间的更新语句。然后再更新dbver表里的版本号
程序每次变动数据库结构都要提升版本号,每次提升版本号,都要增加上一版本号到这一版本号的sql语句。永不清除:
示例:(我把版本号乘以10了,好比较嘛。old版本号就是dbver里的号。15就是最新版本1.5,每次改动数据库都加一个if then
)
procedure ExecUpdate(OldVer: Integer);
begin
if OldVer < 11 then
begin
{DataM.ExecCmd('alter table 用户表 add 是农历 varchar(1) DEFAULT 1');
DataM.ExecCmd(' drop view v_user ');
DataM.ExecCmd(' create view v_user as '
+ ' SELECT 类别表.编码 as 编码, 类别表.父级 as 父级,类别表.名称 as 类别, 用户表.姓名, 用户表.手机, 用户表.生日,用户表.是农历, 用户表.生日提醒, 用户表.加入时间, 用户表.到期时间, 用户表.备注 FROM 用户表 INNER JOIN 类别表 ON 用户表.类别 = 类别表.编码');
DataM.ExecCmd('Create Table 系统信息 (数据库版本号 varchar(10))');
DataM.ExecCmd('insert into 系统信息(数据库版本号) values ('
+ QuotedStr(GetBuildInfo(ParamStr(0), False)) + ')');}
end;
if OldVer < 14 then
begin
{DataM.ExecCmd(' Create Index id_hm on 要发缓存表([号码])');
DataM.ExecCmd(' Create Index id_nr on 要发缓存表([内容])');
DataM.ExecCmd(' Create Index id_sj on 要发缓存表([定时时间])');
DataM.ExecCmd(' Create Index id_hm on 发送缓存表([号码])');
DataM.ExecCmd(' Create Index id_nr on 发送缓存表([内容])');}
end;
if OldVer < 15 then
begin
end;
end;
读出自身版本号的过程为:
function GetBuildInfo(FName: string;
IsALLVerStr: Boolean = True): string;
var
VerInfoSize: DWORD;
VerInfo: Pointer;
VerValueSize: DWORD;
VerValue: PVSFixedFileInfo;
Dummy: DWORD;
begin
Result := '';
VerInfoSize := GetFileVersionInfoSize(PChar(FName), Dummy);
GetMem(VerInfo, VerInfoSize);
if not GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo) then
exit;
VerQueryValue(VerInfo, '/', Pointer(VerValue), VerValueSize);
with VerValue^do
begin
dwProductVersionMS := dwFileVersionMS;
dwProductVersionLS := dwFileVersionLS;
if IsALLVerStr then
Result := Format('%d.%d.%d.%d'
, [dwProductVersionMS shr 16
, dwProductVersionMS and $FFFF
, dwProductVersionLS shr 16
, dwProductVersionLS and $FFFF])
else
Result := Format('%d.%d'
, [dwProductVersionMS shr 16
, dwProductVersionMS and $FFFF]);
end;
FreeMem(VerInfo, VerInfoSize);
end;