Fórum Atualizar banco de dados pelo delphi #174208

20/04/2010

0

Caros Colegas,   Boa noite!!!     Então, gostaria de saber se algum de vc's poderia me ajudar... O que preciso é o seguinte:   Gostaria de desenvolver uma função que diante de uma atualização da aplicação pudesse executar também um scritp de atualização do banco de dados...   Trabalho com Delphi 7 Bd Sql Sever 2005 + ado...     aguardo retorno um abraço     Irenildo Carvalho  
Irenildo Carvalho

Irenildo Carvalho

Responder

Posts

21/04/2010

Wesley Yamazack

Olá amigo,

  Como esta atualização vai acontecer ? Para executar scrips tem várias formas, você pode ter um arquivo .bat, você pode ter um outro executável, você pode ter um flag no banco de dados gravando em um campo (0 ou 1), se o scritp já foi criado ou não. Explique melhor como deverá funcionar sua rotina que lhe ajudo mais especificamente


Att,

Wesley Y
Responder

Gostei + 0

21/04/2010

Irenildo Carvalho

Veja,     A minha idéia seria atualizar de forma automática onde não haja necessidade de acessar nenhum aplicativo de gerenciamento para executar scripts mediante modificações no bd... Cara eu aceito sugestões, o que vc acha?     aguardo   Irenildo
Responder

Gostei + 0

22/04/2010

Wesley Yamazack

Olá amigo,


  Não acho que ficaria legal você engessar o script no seu executável, eu aprovo você criar um arquivo txt com o script, e dentro de um item no menu principal, por exemplo opções / atualizar script, você le o txt e dai atualiza, assim você terá esta função sempre que precisar, sacou ? Acho que assim fica mais "elegante", senão concordar tudo bem vemos outra solução.
  Um abraço

Wesley Y
Responder

Gostei + 0

23/04/2010

Irenildo Carvalho

Wesley, Boa noite!!!   Como seria a opção com flag no banco de dados? Por que no meu caso é necessário automatizar o máximo que puder a atualização através do script...   Imaginei talvés uma forma que, sempre que existisse atualização, que ao iniciar a aplicação pela primeira vez fosse executada uma função pra gerar possíveis alterações no bd, mas como falei antes, não tenho idéia de como fazer isso, então, aceito sugestões... Gostaria de uma opção que não dependesse do usuário pra fazer a atualização, entende?     aguardo Irenildo
Responder

Gostei + 0

24/04/2010

Wesley Yamazack

Olá amigo,
  A ideia do Flag seria você ter uma tabela, AtualizaBanco com um único campo, "Atualiza VarChar(1)".
  Mas de alguma forma você teria que alterar o executável quando precissar modificar o banco, o uso de um meio externo com uma rotina evitaria este tipo de coisa, mas já que você quer automatizar, terá que engessar um pouco.
  Ao abrir a tua aplicação, você da primeira vez irá deixar o flag como "vazio", pois o bd já estar atualizado na primeira vez.
  Quando você mandar outro executável com a atualização do BD, você terá que botar este flag para "s", e criar alguma rotina no seu executável para poder executar o script quando atualiza = "s", caso contrário ele não abre o sistema, porém você sempre que mudar o bd, terá que alterar esta rotina ok ? Tornando assim algo meio engessado como falei anteriormente
  Acho que o caminho que você quer seria este.
  Porém acho que você poderia mandar junto com o executável um script.txt, que ao abrir o executável caso este arquivo exista, você atualiza o bd, depois dela este arquivo. Caso contrário o executável abre normalmente. Entendeu esta outra ideia ?  

Uma Abraço, qualquer coisa estamos aqui.

Wesley Y
Responder

Gostei + 0

24/04/2010

Irenildo Carvalho

rapaz, a idéia do txt serve pra mim, como exatamente posso fazer isso? aguardo Irenildo
Responder

Gostei + 0

26/04/2010

Wesley Yamazack

Olá amigo,

   Primeiramente crie um txt com o nome scritpbd.txt.
   No Oncreate do seu formulário você utiliza a função fileexists que temos no delphi para verificar se um determinado arquivo existe, se o arquivo existir você terá que criar um componente sqlQuery e jogar o script para ele poder executar algo como

Var
  Qry : TSQLQuery;
  S : TStringList;
begin
  S := TStringList.Create;
  S.LoadFromFile('arquivo.txt');
  Qry := TSQLQuery.Create(Self);
  Qry.SQL.Add(S.text);
  Qry.ExecSQL;
End;

Adapte o exemplo a estas dicas para podermos resolver teu problema. Qualquer dúvida estamos aqui.

Att,

Wesley Y
Responder

Gostei + 0

26/04/2010

Irenildo Carvalho

Wesley,     Fiz + ou - como vc me passou , mas acho que falta algo, deu esse erro (Missing Connection or ConnectionString)...   Desculpa a ignorância... Valeu...     Aguardo irenildo
Responder

Gostei + 0

27/04/2010

Wesley Yamazack

Olá amigo,

  Desculpas peço eu. Faltou o seguinte :

Var
  Qry : TSQLQuery;
  S : TStringList;
begin
  S := TStringList.Create;
  S.LoadFromFile('arquivo.txt');
  Qry := TSQLQuery.Create(Self);
  Qry.SQLCOnnection := DM.Conexao; //Seu sqlconnection
  Qry.SQL.Add(S.text);
  Qry.ExecSQL;
End;

Um abraço

Wesley Y
Responder

Gostei + 0

27/04/2010

Irenildo Carvalho

Wesley,     Veja eu fiz dessa forma, eñtão se for alteração de tabela, inclusão de campos por exemplo funciona, mas se for uma alteração em uma procedure, não funciona dar erros sem sentido, tipo incorrect sintax near, onde sei que ta ok , could not find stored procedure... Então tirei todos os comentários da procedure, mesmo assim continua com o erro could not find stored procedure, por que será ?   Obs: Depurando o erro ocorre exatamente na linha ( Qry.ExecSQL;).   aguardo Irenildo   function TfrmMenu.VerificaScriptDatabase: boolean;
var
  Qry : TAdoQuery;
  S : TStringList;
begin     if FileExists('script.txt') then
    begin     frmEspera := TfrmEspera.Create(Application);
    frmEspera.Mensagem := 'Atualizando banco de dados...';
    frmEspera.Show;
    frmEspera.Update;     S := TStringList.Create;
    S.LoadFromFile('script.txt');
    Qry := TAdoQuery.Create(Self);
    Qry.Connection := dmAdo.ADOConnection;
    Qry.SQL.Add(S.text);
    Qry.ExecSQL;     if Qry.IsEmpty then DeleteFile('Script.txt');     frmEspera.Free;
    Qry.Free;
    end;
  end;
Responder

Gostei + 0

28/04/2010

Wesley Yamazack

Olá amigo, fiz aqui escrevendo direto o scritp da procedure no sql, mas você pode continuar lendo do arquivo.


procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  xQry: TSQLQuery;
begin
  xQry := TSQLQuery.Create(Self);
  xQry.SQLConnection := Conexao;
  With xQry.SQL do
  begin
    Add('CREATE PROCEDURE CLIENTETOXPTO ');
    Add(' RETURNS (                      ');
    Add('    CLIENTECOUNT INTEGER)      ');
    Add(' AS                             ');
    Add(' begin                          ');
    Add('  SELECT COUNT(*) FROM CLIENTE INTO :CLIENTECOUNT; ');
    Add('  suspend;                                         ');
    Add(' end;                                               ');
  end;
  ShowMessage( xQry.SQL.Text );
//  xQry.ExecSQL;
  Conexao.ExecuteDirect(xQry.SQL.Text);
end;

Veja se isso irá funcionar

Um abraço

Wesley Y
Responder

Gostei + 0

28/04/2010

Irenildo Carvalho

Wesley,   Não deu certo mano, v só eu não uso DBX, eu trabalho com ADO, por exemplo no AdoConnection não tem essa função executeDirect...     Aguardo
Responder

Gostei + 0

28/04/2010

Wesley Yamazack

Olá amigo..


Crei uma variável

Var
  xQry: TSQLQuery;

  Cont : Integer;
begin
  xQry := TSQLQuery.Create(Self);
  xQry.SQLConnection := Conexao;
  With xQry.SQL do
  begin
    Add('CREATE PROCEDURE CLIENTETOXPTO ');
    Add(' RETURNS (                      ');
    Add('    CLIENTECOUNT INTEGER)      ');
    Add(' AS                             ');
    Add(' begin                          ');
    Add('  SELECT COUNT(*) FROM CLIENTE INTO :CLIENTECOUNT; ');
    Add('  suspend;                                         ');
    Add(' end;                                               ');
  end;
  ShowMessage( xQry.SQL.Text );
//  xQry.ExecSQL;
ADOConnection1.Execute( xQry.SQL.Text, Count);
end;


Faça as alterações para o ADO. Blz ?

Att,

Wesley Y
Responder

Gostei + 0

28/04/2010

Irenildo Carvalho

Ei, Não deu certo, dar os mesmos erro de antes...     aguardo
Responder

Gostei + 0

28/04/2010

Wesley Yamazack

Olá amigo,

  Faz o seguinte posta aqui o código do evento que você esta fazendo, e o scritp da procedure.

Um abraço

Wesley Y
Responder

Gostei + 0

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

Aceitar