Atualizar banco de dados pelo delphi
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
Curtidas 0
Respostas
Wesley Yamazack
20/04/2010
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
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
GOSTEI 0
Irenildo Carvalho
20/04/2010
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
GOSTEI 0
Wesley Yamazack
20/04/2010
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
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
GOSTEI 0
Irenildo Carvalho
20/04/2010
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
GOSTEI 0
Wesley Yamazack
20/04/2010
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
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
GOSTEI 0
Irenildo Carvalho
20/04/2010
rapaz,
a idéia do txt serve pra mim, como exatamente posso fazer isso?
aguardo
Irenildo
GOSTEI 0
Wesley Yamazack
20/04/2010
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
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
GOSTEI 0
Irenildo Carvalho
20/04/2010
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
GOSTEI 0
Wesley Yamazack
20/04/2010
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
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
GOSTEI 0
Irenildo Carvalho
20/04/2010
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;
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;
GOSTEI 0
Wesley Yamazack
20/04/2010
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
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
GOSTEI 0
Irenildo Carvalho
20/04/2010
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
GOSTEI 0
Wesley Yamazack
20/04/2010
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
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
GOSTEI 0
Irenildo Carvalho
20/04/2010
Ei, Não deu certo, dar os mesmos erro de antes...
aguardo
GOSTEI 0
Wesley Yamazack
20/04/2010
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
Faz o seguinte posta aqui o código do evento que você esta fazendo, e o scritp da procedure.
Um abraço
Wesley Y
GOSTEI 0
Irenildo Carvalho
20/04/2010
Segue:
http://video.devmedia.com.br/discovirtual/201854/SCRIPT.zip
function TfrmMenu.VerificaScriptDatabase: boolean;
var
Qry : TAdoQuery;
S : TStringList;
Count : Integer;
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);
dmAdo.ADOConnection.Execute(Qry.SQL.Text, count); if Qry.IsEmpty then DeleteFile('script.txt'); frmEspera.Free;
Qry.Free;
end;
end;
var
Qry : TAdoQuery;
S : TStringList;
Count : Integer;
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);
dmAdo.ADOConnection.Execute(Qry.SQL.Text, count); if Qry.IsEmpty then DeleteFile('script.txt'); frmEspera.Free;
Qry.Free;
end;
end;
GOSTEI 0
Wesley Yamazack
20/04/2010
Olá amigo, fiz um exemplo aqui com uma procedure pequena veja a estrutura da mesma.
CREATE PROCEDURE sp_Cliente
-- comentarios q vc pode criar
-- comentarios q vc pode criar
-- comentarios q vc pode criar
-- comentarios q vc pode criar
@id integer
AS
SELECT nome
FROM cliente
WHERE idcliente = @id
Estrutura do código utilizado.
procedure TForm1.Button1Click(Sender: TObject);
Var
xQry : TADOQuery;
begin
xQry := TADOQuery.Create(Self);
xQry.Connection := ADOConnection1;
xQry.SQL.LoadFromFile('c:\proc.txt');
ShowMessage(xQry.SQL.Text);
xQry.ExecSQL;
end;
Att,
Wesley Y
CREATE PROCEDURE sp_Cliente
-- comentarios q vc pode criar
-- comentarios q vc pode criar
-- comentarios q vc pode criar
-- comentarios q vc pode criar
@id integer
AS
SELECT nome
FROM cliente
WHERE idcliente = @id
Estrutura do código utilizado.
procedure TForm1.Button1Click(Sender: TObject);
Var
xQry : TADOQuery;
begin
xQry := TADOQuery.Create(Self);
xQry.Connection := ADOConnection1;
xQry.SQL.LoadFromFile('c:\proc.txt');
ShowMessage(xQry.SQL.Text);
xQry.ExecSQL;
end;
Att,
Wesley Y
GOSTEI 0
Irenildo Carvalho
20/04/2010
Rapaz, o mesmo código que vc me passou, dar esse erro
GOSTEI 0
Wesley Yamazack
20/04/2010
Olá amigo, você jogou este código no TXT ? E depois executou o outro no botão?
Um abraço
Wesley Y
Um abraço
Wesley Y
GOSTEI 0
Irenildo Carvalho
20/04/2010
Pois é. não tô entendo o que ta havendo
GOSTEI 0
Wesley Yamazack
20/04/2010
Olá meu amigo,
Que problema chato este, teria como você criar um form, com o código+ txt(com a procedure) + o banco de dados de teste ? Para que eu possa montar um ambiente idêntico ao seu, seria possível ?
Um abraço
Wesley Y
Que problema chato este, teria como você criar um form, com o código+ txt(com a procedure) + o banco de dados de teste ? Para que eu possa montar um ambiente idêntico ao seu, seria possível ?
Um abraço
Wesley Y
GOSTEI 0
Wesley Yamazack
20/04/2010
Olá amigo, estamos aguardando seu retorno para continuar com o chamado.
Att,
Wesley Y
Att,
Wesley Y
GOSTEI 0
Wesley Yamazack
20/04/2010
Olá amigo, teve algum progresso ? Estamos a disposição
Att,
Wesley Y
Att,
Wesley Y
GOSTEI 0
Devmedia
20/04/2010
Irenildo,
por falta de retorno estamos encerrando o chamado. caso tenha dúvidas sobre o tópico aqui abordado, por favor, volte a postar aqui mesmo que o consultor voltará a lhe atender e o chamado será reaberto.
por falta de retorno estamos encerrando o chamado. caso tenha dúvidas sobre o tópico aqui abordado, por favor, volte a postar aqui mesmo que o consultor voltará a lhe atender e o chamado será reaberto.
GOSTEI 0