Atualização Automática do Sistema

23/05/2006

0

Olá profissionais,

Gostaria de pedir a ajuda para uma implementação no meu sistema que a meses deveria ter feito. É o seguinte toda vez que tenho uma atualização do sistema tenho que sair cliente por cliente atualizando (pois muitos naum conseguem nem abrir o cd), então gostaria de poder devenvolver algo que quando o usuário abrir o sistema ele verificasse se há atualização e fizesse estas atualização automatica.

Perguntas:

1. Alguém tem algum exemplo? (por favor me mandar rodrigo@mdu.org.br)

2. Ele iria baixar o exe inteiro da net toda vez que tiver atualização. (Ex: meu sistema é o Mercado.exe ele baixaria um Mercado.exe e substituiria pelo do cliente, é assim que funciona).

3. E como seria a atualização do Banco de Dados (Uso Firebird 1.5.2).

4. Onde vou colocar a Atualização em um site, ou servidor.

Obrigado,
Rodrigo.


Rodrigorpb

Rodrigorpb

Responder

Posts

24/05/2006

Rodrigorpb

Alguém saberia responder minha dúvida ou sabe de algum artigo?


Rodrigo


Responder

24/05/2006

Eliasexner

Olá

Fiz uma implementação parecida em um sistema de impressão de etiquetas, que é utilizado por várias filiais de uma empresa.

Passos da Atualização:

Disponibilizo em um servidor FTP, pode ser interno da empresa ou junto com a hospedagem de um site, a nova versão do .exe do sistema.

Quando o sistema é executado no cliente, o sistema conecta o FTP através do compoenente idFTP (indy Clients) e verifica se a data de criação do arquivo do FTP (atualizado) é maior do que o .exe local.
Se for, renomeia o .exe local e baixa o .exe do FTP que tem o mesmo nome. Ex: Mercado.exe . OBS. Vc poderá renomear o exe local mesmo executando o mesmo.

Após ter baixado a atualização, vc executa o .exe atualizado e com o comando application.terminate finaliza o sistema em execução (versão antiga).

Isso funciona beleza.

Porém, vc não possui desta maneira um controle do processo de download. O que poderia ser feito para melhorar a rotina é ter um executável a parte para buscar a atualização. E no sistema ´mercado.exe´, vc poderia controlar os bytes já baixados pelo sistema de atualização, levando em consideração que o sistema fica ´trancado´ enquanto baixa o arquivo e o usuário não sabe em qual processo está o download. Com essa melhoria vc poderia implementar uma barra de processo

espero ter ajudado.
Segue código...

if FormatDateTime(´dd/mm/yyyy hh:mm´, FileDateToDateTime(FileAge(ExtractFilePath(ParamStr(0)) + ´XXXX.exe´))) <>
FormatDateTime(´dd/mm/yyyy hh:mm´,IdFTP1.FileDate(´/fabricante/XXXX.exe´))
then
begin
data := FormatDateTime(´dd/mm/yyyy hh:mm´,(IdFTP1.FileDate(´/fabricante/XXXX.exe´)));

if Application.MessageBox(Pchar(´Existe uma Nova versão do sistema XXXX disponível. ´ + #1313 + ´Data da Versão: ´ +Data + 1313 +
´É recomendado sempre realizar a atualização. Ela possui melhorias a correção de erros. ´ + 1313 + ´Deseja Atualizar?´),´Atualização Automática XXXX´, MB_YESNO + MB_ICONQUESTION) = idyes then
begin
Screen.Cursor := crHourGlass;
//caminho do FTP
orig:=´/fabricante/XXXX.exe´;
//caminho da aplicação na máquina cliente
dest:= ExtractFilePath(ParamStr(0)) + ´XXXX.exe´;
//renomeia exe atual
RenameFile(ExtractFilePath(ParamStr(0)) + ´XXXX.exe´,ExtractFilePath(ParamStr(0)) + ´XXXX_OLD.exe´);
idftp1.get(orig,dest,true,false);
//Seta a data do arquio baixado, para a mesma data do arquivo do FTP para não baixar novamente
FileSetDate(dest,DateTimeToFileDate(IdFTP1.FileDate(orig)));
Application.MessageBox(´O Sistema foi Atualizado e será reiniciado.´,´Atualização Concluída´,MB_OK + MB_ICONINFORMATION);
//executa exe atualizado
WinExec(Pchar(dest),SW_SHOWNORMAL);
Application.Terminate;
end;
end;


Responder

24/05/2006

Rodrigorpb

Obrigado,

Gostaria de saber como faço para atualizar o banco de dados também, uso o FB 1.5.2


Rodrigo.


Responder

24/05/2006

Eliasexner

Uma maneira de atualizar o banco de dados, seria disponibilizar scripts de sql ´arquivo.sql´ no ftp baixar junto com a atualização e copiar em alguma pasta do sistema.

ao iniciar o sistema, vc poderia executar estes SQL´s através de uma componente ´execsql´ por exemplo, e depois excluir os arquivos.

Isso serviria apenas para modificações em banco como criar novo campo, criar nova tabela, editar tamanho e tipos de campos etc.

assim vc não precisa replicar o banco de dados para as novas atualizações.

Realmente não sei se este é o porcedimento mais. Nunca fiz a atualização de banco de dados automática. mas acredito que seria uma opção

Espero ter ajudado


Responder

02/06/2006

Fernando_cunha

olá amigo eu estou tentando rodar o programa com esta dica que voce passou, porem dá erro ao compilar o exe...

IdFTP1.FileDate.... fala que não tem este metodo FILEDATE... lembrando que estou usando o delphi 7 ....

poderia me ajudar?


Responder

01/12/2006

Facc

olá amigo eu estou tentando rodar o programa com esta dica que voce passou, porem dá erro ao compilar o exe... IdFTP1.FileDate.... fala que não tem este metodo FILEDATE... lembrando que estou usando o delphi 7 .... poderia me ajudar?


Bom dia amigo... Vc conseguiu resolver isso?


Responder

01/12/2006

Quartieri

No caso da atualização do banco de dados é simples se vc tiver usando POO, aki na empresa fazemos assim, a classe ´cliente´ por exemplo, quando é instânciada verifica a tabela no banco, se a tabela não existir ele cria, depois disso, checa os campos, pois se for apenas atualização com a checagem dos campos adicionamos os campos que faltam no banco, tudo isso simples e fácil.


Responder

01/12/2006

Facc

No caso da atualização do banco de dados é simples se vc tiver usando POO, aki na empresa fazemos assim, a classe ´cliente´ por exemplo, quando é instânciada verifica a tabela no banco, se a tabela não existir ele cria, depois disso, checa os campos, pois se for apenas atualização com a checagem dos campos adicionamos os campos que faltam no banco, tudo isso simples e fácil.


O caso da atualização eu resolvi com xml, criei uma tabela no bd (firebird) que salva as atualizações realizadas. esse arquivo xml lê essa tabela e acrescenta/cria apenas akeles scripts que não estão gravados na tabela. O que eu queria saber é o seguinte... a atualização do executavel via internet... mas não queria usar ftp, pois minha maquina não fica ligada 24 hrs.


Responder

02/12/2006

Megsoft

Meu amigo,

eu estava com um problema parecido, mas conseguir esta dica aki mesmo no forum e resolvi meu problema.

Nesse artigo, vou mostrar como atualizar o sistema através da versão do mesmo.
Crie uma pasta chamada Projeto
Dentro dessa pasta crie mais duas pastas uma chamada UpDate e outra de Servidor. Agora Inicie uma nova aplicação no delphi

Criando o Sistema que vai Atualizar nosso Sistema

Esse será a nossa aplicação auxiliar, ou seja, o nosso atualizador.
Iremos usar nessa nossa aplicação os seguintes componentes:
1 -Tlabel
1 -TGauge
1 - TTimer


Figura da nossa aplicação.


Sete as seguintes propriedades do seu form:
BorderStyle: bsNome;
Position: poScreenCenter;
Name: FrmUpDate
Sete a propriedade Enabled do TTimer para False

Mude o nome do TGauge1 para Gauge chame a Unit do projeto F12 para alternar entre o form e a unit e declare as seguintes variáveis
Código:
var FrmUpDate: TFrmUpDate;//Esse é nosso form //Declare essas duas variáveis ExeAtualiza, ExeAtual : String;


Nas minhas aplicações eu utilizo arquivos ini para um melhor controle das paths e configurações do meus sistema aqui não irei abordar o uso desses arquivos...
No evento OnCreate do form faça:
Código:
procedure TFrmUpDate.FormCreate(Sender: TObject); begin //Aqui pego o nome do arquivo responsável pela atualização (update.udp) //vamos supor que seria uma versão atualizada no servidor da rede por exemplo ExeAtualiza := ExtractFilePath(ParamStr(0))+´Sistema\Sistema.exe´; //Aqui pego o nome do arquivo atual para checagem da versão //supondo que seja o executável da estação ExeAtual := ExtractFilePath(ParamStr(0))+´Sistema.exe´; end;

no onDestroy coloque esse código:
Código:
procedure TFrmUpDate.FormDestroy(Sender: TObject); begin if FileExists(ExeAtual) then//Aqui verifico se o novo arquivo já existe e executo o mesmo na finalização do nosso atualizador. WinExec( Pchar(ExeAtual), SW_NORMAL ); end;

no onShow coloque esse código
Código:
procedure TFrmUpDate.FormShow(Sender: TObject); begin Timer1.Enabled := True; end;

Na seção private declare a procedure que será responsável pela cópia dos arquivos...
Código:
Procedure CopyFile(Origem, Destino: string);

Pressione as teclas Ctrl+Shift+C com isso o delphi vai criar a estrutura da nossa procedure, então implemente o código da mesma como mostrado abaixo:
Código:
Procedure TFrmUpDate.CopyFile(Origem, Destino: string); var FromF,ToF: file of byte; Buffer: array[0..4096] of char; NumRead: Integer; FileLength: LongInt; NewPath: string; begin // Antes de copiar, verifica se já existe o diretório // Caso o diretório não exista, o mesmo vai ser criado NewPath := ExtractFilePath(Destino); if not DirectoryExists(NewPath) then begin CreateDir(NewPath); end; // Copia o arquivo // Abre o arquivo de origem e cria o arquivo destino AssignFile(FromF, Origem); Reset(FromF); AssignFile(ToF, Destino); ReWrite(ToF); FileLength := FileSize(FromF); with Gauge do begin Progress := 0; MinValue := 0; MaxValue := FileLength; while FileLength > 0 do begin BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead); FileLength := FileLength - NumRead; BlockWrite(ToF, Buffer[0], NumRead); AddProgress(NumRead); end; CloseFile(FromF); CloseFile(ToF); end; end;


selecione o nosso Timer e no evento OnTimer implemente o código abaixo;
Código:
procedure TFrmUpDate.Timer1Timer(Sender: TObject); begin Gauge.Visible := True; Timer1.Enabled := False; if Not ( FileExists( ExeAtualiza ) ) then begin MessageDlg(´Erro ao ler o arquivo de Atualização. Arquivo ´ + ExeAtualiza + ´ não encontrado ´,mtWarning,[mbOK],0); Halt(0); end else if Not ( FileExists( ExeAtual ) )then begin MessageDlg(´Erro ao tentar atualizar o sistema. Arquivo ´ + ExeAtual + ´ não encontrado´,mtWarning,[mbOK],0); Halt(0); end else begin CopyFile( ExeAtualiza , ExeAtual ); Label1.Caption := #10+´Aguarde...´; Label1.Refresh; Label1.Update; Close; end;


Salve o nosso projeto dentro da nossa pasta UpDate com o nome atzapp e compile o nosso projeto, com isso, terminamos a criação da aplicação que vai auxiliar na atualização de nosso sistema.

CRIANDO O SISTEMA PROPRIAMENTE DITO

Agora vamos à criação do nosso “Sistema” para tal crie uma nova aplicação não precisa colocar nenhum componente apenas vamos setar as configurações de versão do nosso projeto, para isso vá no menu project > Options > Version Info e marque o CheckBox Include Version information in project como mostrado na figura abaixo:



Nessa nossa aplicação vamos apenas colocar um TLabel e caption como mostrado abaixo:


Vá para unit do projeto e vamos implementar o código para checagem da versão atual com o existente no servidor da nossa aplicação:
Crie as duas variáveis globais na no form principal:
Código:
var Form1: TForm1;//Nosso formulário NovaVersao:Boolean; AtzApp : String;

Abaixo da seção implementation cria a seguinte função
Código:
{ retorna a versão do executavel } function VersaoExe(const Filename: String): String; type TVersionInfo = packed record Dummy: array[0..7] of Byte; V2, V1, V4, V3: Word; end; var Zero, Size: Cardinal; Data: Pointer; VersionInfo: ^TVersionInfo; begin Size := GetFileVersionInfoSize(Pointer(Filename), Zero); if Size = 0 then Result := ´´ else begin GetMem(Data, Size); try GetFileVersionInfo(Pointer(Filename), 0, Size, Data); VerQueryValue(Data, ´\´, Pointer(VersionInfo), Size); Result := Format(´¬d.¬d.¬d.¬d´, [VersionInfo.V1, VersionInfo.V2, VersionInfo.V3, VersionInfo.V4]); finally FreeMem(Data); end; end; end;


no evento OnCreate do form principal de nossa aplicação faça:
Código:
procedure TForm1.FormCreate(Sender: TObject); var Atual,UpDate:String; begin NovaVersao := False; Atual := ExtractFilePath(ParamStr(0))+ExtractFileName(ParamStr(0)); UpDate := ExtractFilePath(ParamStr(0))+´Servidor\Sistema.exe´; AtzApp := ExtractFilePath(ParamStr(0))+´AtzApp.exe´; if ( FileExists(Atual) ) and ( FileExists(UpDate) ) then if VersaoExe(Atual) <> VersaoExe(UpDate) then begin NovaVersao := True; Application.Terminate; end; Caption := ´Versão Atual:´ + VersaoExe(Atual) end;


no onDestroy coloque o seguinte código:
Código:
procedure TForm1.FormDestroy(Sender: TObject); begin if NovaVersao then WinExec(pChar(AtzApp),SW_NORMAL); end;



Salve o projeto com o nome Sistema na pasta Servidor e compile-o. para testar-mos vamos fazer o seguinte: Copie os executáveis AtzApp.exe e Sistema.exe para nossa pasta principal (Projeto) execute o arquivo sistema e ele vai abrir normalmente, pois as versões dos arquivos da pasta Servidor e Esse são os mesmos.
Agora feche o sistema, vá para o delphi novamente abra o projeto Sistema e mude a versão do mesmo Project > Options > Version Info...
Quando se tem um projeto completo pode-se usar o comando Build Project (que no nosso caso seria Build Sistema) que ele muda automaticamente a versão do Build, mais depois de dar o build é preciso salvar e compilar para que a nova versão seja registrada na aplicação compilada. Agora que você alterou a versão da sua aplicação feche-a e execute novamente o seu sistema como se fosse na estação, aquele que copiamos para pasta principal e veja o resultado!
Espero que tenha ajudado qq dúvida e/ou sugestão estou aberto. Quem tiver alguma melhoria posta aqui para beneficiar a todos do fórum, espero que tenham gostado um forte abraço e até a próxima


Responder

22/03/2008

Cyborg*

Meu amigo, eu estava com um problema parecido, mas conseguir esta dica aki mesmo no forum e resolvi meu problema. Nesse artigo, vou mostrar como atualizar o sistema através da versão do mesmo. Crie uma pasta chamada Projeto Dentro dessa pasta crie mais duas pastas uma chamada UpDate e outra de Servidor. Agora Inicie uma nova aplicação no delphi Criando o Sistema que vai Atualizar nosso Sistema Esse será a nossa aplicação auxiliar, ou seja, o nosso atualizador. Iremos usar nessa nossa aplicação os seguintes componentes: 1 -Tlabel 1 -TGauge 1 - TTimer Figura da nossa aplicação. Sete as seguintes propriedades do seu form: BorderStyle: bsNome; Position: poScreenCenter; Name: FrmUpDate Sete a propriedade Enabled do TTimer para False Mude o nome do TGauge1 para Gauge chame a Unit do projeto F12 para alternar entre o form e a unit e declare as seguintes variáveis Código: var FrmUpDate: TFrmUpDate;//Esse é nosso form //Declare essas duas variáveis ExeAtualiza, ExeAtual : String; Nas minhas aplicações eu utilizo arquivos ini para um melhor controle das paths e configurações do meus sistema aqui não irei abordar o uso desses arquivos... No evento OnCreate do form faça: Código: procedure TFrmUpDate.FormCreate(Sender: TObject); begin //Aqui pego o nome do arquivo responsável pela atualização (update.udp) //vamos supor que seria uma versão atualizada no servidor da rede por exemplo ExeAtualiza := ExtractFilePath(ParamStr(0))+´Sistema\Sistema.exe´; //Aqui pego o nome do arquivo atual para checagem da versão //supondo que seja o executável da estação ExeAtual := ExtractFilePath(ParamStr(0))+´Sistema.exe´; end; no onDestroy coloque esse código: Código: procedure TFrmUpDate.FormDestroy(Sender: TObject); begin if FileExists(ExeAtual) then//Aqui verifico se o novo arquivo já existe e executo o mesmo na finalização do nosso atualizador. WinExec( Pchar(ExeAtual), SW_NORMAL ); end; no onShow coloque esse código Código: procedure TFrmUpDate.FormShow(Sender: TObject); begin Timer1.Enabled := True; end; Na seção private declare a procedure que será responsável pela cópia dos arquivos... Código: Procedure CopyFile(Origem, Destino: string); Pressione as teclas Ctrl+Shift+C com isso o delphi vai criar a estrutura da nossa procedure, então implemente o código da mesma como mostrado abaixo: Código: Procedure TFrmUpDate.CopyFile(Origem, Destino: string); var FromF,ToF: file of byte; Buffer: array[0..4096] of char; NumRead: Integer; FileLength: LongInt; NewPath: string; begin // Antes de copiar, verifica se já existe o diretório // Caso o diretório não exista, o mesmo vai ser criado NewPath := ExtractFilePath(Destino); if not DirectoryExists(NewPath) then begin CreateDir(NewPath); end; // Copia o arquivo // Abre o arquivo de origem e cria o arquivo destino AssignFile(FromF, Origem); Reset(FromF); AssignFile(ToF, Destino); ReWrite(ToF); FileLength := FileSize(FromF); with Gauge do begin Progress := 0; MinValue := 0; MaxValue := FileLength; while FileLength > 0 do begin BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead); FileLength := FileLength - NumRead; BlockWrite(ToF, Buffer[0], NumRead); AddProgress(NumRead); end; CloseFile(FromF); CloseFile(ToF); end; end; selecione o nosso Timer e no evento OnTimer implemente o código abaixo; Código: procedure TFrmUpDate.Timer1Timer(Sender: TObject); begin Gauge.Visible := True; Timer1.Enabled := False; if Not ( FileExists( ExeAtualiza ) ) then begin MessageDlg(´Erro ao ler o arquivo de Atualização. Arquivo ´ + ExeAtualiza + ´ não encontrado ´,mtWarning,[mbOK],0); Halt(0); end else if Not ( FileExists( ExeAtual ) )then begin MessageDlg(´Erro ao tentar atualizar o sistema. Arquivo ´ + ExeAtual + ´ não encontrado´,mtWarning,[mbOK],0); Halt(0); end else begin CopyFile( ExeAtualiza , ExeAtual ); Label1.Caption := #10+´Aguarde...´; Label1.Refresh; Label1.Update; Close; end; Salve o nosso projeto dentro da nossa pasta UpDate com o nome atzapp e compile o nosso projeto, com isso, terminamos a criação da aplicação que vai auxiliar na atualização de nosso sistema. CRIANDO O SISTEMA PROPRIAMENTE DITO Agora vamos à criação do nosso “Sistema&8221; para tal crie uma nova aplicação não precisa colocar nenhum componente apenas vamos setar as configurações de versão do nosso projeto, para isso vá no menu project > Options > Version Info e marque o CheckBox Include Version information in project como mostrado na figura abaixo: Nessa nossa aplicação vamos apenas colocar um TLabel e caption como mostrado abaixo: Vá para unit do projeto e vamos implementar o código para checagem da versão atual com o existente no servidor da nossa aplicação: Crie as duas variáveis globais na no form principal: Código: var Form1: TForm1;//Nosso formulário NovaVersao:Boolean; AtzApp : String; Abaixo da seção implementation cria a seguinte função Código: { retorna a versão do executavel } function VersaoExe(const Filename: String): String; type TVersionInfo = packed record Dummy: array[0..7] of Byte; V2, V1, V4, V3: Word; end; var Zero, Size: Cardinal; Data: Pointer; VersionInfo: ^TVersionInfo; begin Size := GetFileVersionInfoSize(Pointer(Filename), Zero); if Size = 0 then Result := ´´ else begin GetMem(Data, Size); try GetFileVersionInfo(Pointer(Filename), 0, Size, Data); VerQueryValue(Data, ´\´, Pointer(VersionInfo), Size); Result := Format(´¬d.¬d.¬d.¬d´, [VersionInfo.V1, VersionInfo.V2, VersionInfo.V3, VersionInfo.V4]); finally FreeMem(Data); end; end; end; no evento OnCreate do form principal de nossa aplicação faça: Código: procedure TForm1.FormCreate(Sender: TObject); var Atual,UpDate:String; begin NovaVersao := False; Atual := ExtractFilePath(ParamStr(0))+ExtractFileName(ParamStr(0)); UpDate := ExtractFilePath(ParamStr(0))+´Servidor\Sistema.exe´; AtzApp := ExtractFilePath(ParamStr(0))+´AtzApp.exe´; if ( FileExists(Atual) ) and ( FileExists(UpDate) ) then if VersaoExe(Atual) <> VersaoExe(UpDate) then begin NovaVersao := True; Application.Terminate; end; Caption := ´Versão Atual:´ + VersaoExe(Atual) end; no onDestroy coloque o seguinte código: Código: procedure TForm1.FormDestroy(Sender: TObject); begin if NovaVersao then WinExec(pChar(AtzApp),SW_NORMAL); end; Salve o projeto com o nome Sistema na pasta Servidor e compile-o. para testar-mos vamos fazer o seguinte: Copie os executáveis AtzApp.exe e Sistema.exe para nossa pasta principal (Projeto) execute o arquivo sistema e ele vai abrir normalmente, pois as versões dos arquivos da pasta Servidor e Esse são os mesmos. Agora feche o sistema, vá para o delphi novamente abra o projeto Sistema e mude a versão do mesmo Project > Options > Version Info... Quando se tem um projeto completo pode-se usar o comando Build Project (que no nosso caso seria Build Sistema) que ele muda automaticamente a versão do Build, mais depois de dar o build é preciso salvar e compilar para que a nova versão seja registrada na aplicação compilada. Agora que você alterou a versão da sua aplicação feche-a e execute novamente o seu sistema como se fosse na estação, aquele que copiamos para pasta principal e veja o resultado! Espero que tenha ajudado qq dúvida e/ou sugestão estou aberto. Quem tiver alguma melhoria posta aqui para beneficiar a todos do fórum, espero que tenham gostado um forte abraço e até a próxima


Nossa cara, vc misturou tudo o código com a escrita //
ae fica dificil de entender!

--´


Responder

22/03/2008

Cyborg*

achei o tópico original, po vei decha a fonte!


Responder

23/03/2008

Wanderok

Ola pessoal....

Feliz Páscoa a todos !!!! :D:D:D

Alguém implementou esta solução ?
Eu vou implementar e ver no que dá .... Pois é a solução de meus problemas.

Abraços.


Responder

23/03/2008

Paullsoftware

Ae galera, o Adriano Santos tem um artigo aqui no forum que mostra como fazer essas atualizações via web, eu tb tenho uma e o artigo dele foi muito útil pra mim tirei algumas dúvidas relativas ao assunto segue abaixo o tópico com o artigo do Adriano...

http://forum.devmedia.com.br/viewtopic.php?t=86453

espero ter ajudado! :wink:


Responder

23/03/2008

Wanderok

Poxa !!!!!!!!!!!!!!!!!!!!!!!!!!

Tudo mastigadinho !!!!!!!!!!!!!!!!

Implementarei e postarei os resultados....

Presentão de Páscoa este hein ?????

Valeu pessoal :D:D:D


Responder

15/10/2018

Jeferson Machia

Poxa !!!!!!!!!!!!!!!!!!!!!!!!!!<br />
<br />
Tudo mastigadinho !!!!!!!!!!!!!!!!<br />
<br />
Implementarei e postarei os resultados....<br />
<br />
Presentão de Páscoa este hein ?????<br />
<br />
Valeu pessoal :D:D:D<br />
<br />
<br />
<br />
<br />
Amigo eu tenho um sistema que ele faz a atualização via web. Ele pega o exe que está rodando e compara com a versão que tem na web e se forem diferentes ele automaticamente faz o download do novo arquivo, renomeia o antigo e joga o novo no lugar, depois disso ele fecha o sistema para que force o usuário a abrir a nova versão. Aqui para mim funcionou bem. Em relação aos bancos eu montei um executável onde todas as alterações ou criações de banco, eu vou copiando a linha e salvando dentro dele usando um txt para guardar. Depois de pronto é somente chamar o executável para atualizar as tabelas <br />
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar