Por lo visto hay varios Frameworks para eso
http://instantobjects.sourceforge.net/
http://tiopf.sourceforge.net
https://code.google.com/p/delphi-orm/
https://sourceforge....arryhengensopf/
http://www.macrobjec...bject/index.htm
https://www.tmssoftw...te/aurelius.asp
De momento con este código lo tengo resuelto
uses Windows;
function GetAppVersion: word;
var
VerInfoSize, VerValueSize, Dummy: DWORD;
VerInfo: Pointer;
VerValue: PVSFixedFileInfo;
begin
Result:= 0;
VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);
if VerInfoSize > 0 then
begin
GetMem(VerInfo, VerInfoSize);
try
if GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo) then
begin
VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
with VerValue^ do
begin
Result := dwFileVersionMS shr 16;
// V2 := dwFileVersionMS and $FFFF;
// V3 := dwFileVersionLS shr 16;
// V4 := dwFileVersionLS and $FFFF;
end;
end;
finally
FreeMem(VerInfo, VerInfoSize);
end;
end;
end;
function TdmGlobal.TableExist: boolean;
var
oList: TStrings;
begin
oList := TStringList.Create;
try
cntData.GetTableNames('', '', 'AJUSTE', oList);
Result := oList.Count > 0;
finally
oList.Free;
end;
end;
function TdmGlobal.GetDBVersion: integer;
begin
if TableExist then
with qryData do
begin
Close;
SQL.Clear;
SQL.Add('SELECT valor FROM ajuste WHERE nombre = ' + QuotedStr('VERSION'));
Open;
Exit(FieldByName('valor').AsInteger);
end
else
Result := 0
end;
procedure TdmGlobal.InitData(cntName: string);
var
AppVersion: integer;
DBVersion: integer;
i: integer;
begin
cntData.Close;
cntData.Params.Database:= 'C:\AppData\' + cntName + '.fdb';
cntData.Open;
DBVersion:= GetDBVersion;
AppVersion:= GetAppVersion;
if AppVersion > DBVersion then
begin
Script.SQLScripts.Clear;
Script.SQLScripts.Add;
for i := DBVersion to Pred(AppVersion) do
UpdateStructure(i + 1);
Script.ValidateAll;
Script.ExecuteAll;
UpdateDatabaseVersion(i);
end;
end;
procedure TdmGlobal.UpdateDatabaseVersion(aVersion: integer);
begin
with qryData do
begin
Close;
SQL.Clear;
SQL.Add('update ajuste set valor = ' + IntToStr(aVersion));
SQL.Add('where nombre = ' + QuotedStr('VERSION'));
ExecSQL;
end;
end;
procedure TdmGlobal.UpdateStructure(aVersion: integer);
begin
with Script.SQLScripts.Add do
begin
Name:= 'S' + IntToStr(aVersion);
SQL.LoadFromStream(
TResourceStream.Create(hInstance, Name, RT_RCDATA));
Script.SQLScripts[0].SQL.Add('@' + Name);
end;
end;
Uso un conector de Firedac, un FDQuery y un FDScript, en el FDScript le agregue un FDSQLScript para después en su posición 0 agregar los nombres de los scripts que se van a llamar, estos scripts son archivos de texto que agregue en el proyecto como recursos, los quise llamar directamente sin usar sus nombres pero no me funciono.
Saludos