Fórum Atualizador de BD via Delphi #407102
25/08/2011
0
Olá pessoal tudo bom?
Gostaria de uma ajuda de vocês. To tentando criar um atualizador de banco de dados, pra distribuir com a aplicação que tiver alteração no banco.
Pensei em fazer um exe em delphi mesmo, então criei uma aplicaçao, coloquei um SQLConnection, um SQLDataSet, um Button e um Label e fiz o código abaixo, que funcionou:
SqlDataSet1.Close;
with SqlDataSet1 do
begin
close;
CommandText :=
'CREATE TABLE TB_TESTE2 ('
+ 'PKCOD_TESTE2 BIGINT NOT NULL,'
+ 'NOME_TESTE2 VARCHAR(50) NOT NULL COLLATE PT_BR,'
+ 'NOME_COMPLETO_TESTE2 VARCHAR(50) COLLATE PT_BR)';
open;
end; Só que quando tentei botar um "alter table", assim:
SqlDataSet1.Close;
with SqlDataSet1 do
begin
close;
CommandText :=
'CREATE TABLE TB_TESTE2 ('
+ 'PKCOD_TESTE2 BIGINT NOT NULL,'
+ 'NOME_TESTE2 VARCHAR(50) NOT NULL COLLATE PT_BR,'
+ 'NOME_COMPLETO_TESTE2 VARCHAR(50) COLLATE PT_BR);'
+ 'ALTER TABLE TB_TESTE2 ADD CONSTRAINT PK_TB_TESTE2 PRIMARY KEY (PKCOD_TESTE2)';
open;
end; Não funcinou, deu erro no "alter". Ainda tente fazer primeiro o create table e depois o alter como abaixo:
SqlDataSet1.Close;
with SqlDataSet1 do
begin
close;
CommandText :=
'ALTER TABLE TB_TESTE2 ADD CONSTRAINT PK_TB_TESTE2 PRIMARY KEY (PKCOD_TESTE2)';
open;
end; E também não funcinou. Ele só funcionou quando eu fiz, primeiro o create table, sem o alter, depois parei a aplicaçao, comentei o create table e rodei só o alter table, aí funcionou. Alguém saberia porque eles não funcionam juntos? Pois eu ainda pretendo criar generators e triggers desse mesmo jeito, e gostaria que fosse tudo numa tacada só. Grato pela atenção. Abraços.
with SqlDataSet1 do
begin
close;
CommandText :=
'CREATE TABLE TB_TESTE2 ('
+ 'PKCOD_TESTE2 BIGINT NOT NULL,'
+ 'NOME_TESTE2 VARCHAR(50) NOT NULL COLLATE PT_BR,'
+ 'NOME_COMPLETO_TESTE2 VARCHAR(50) COLLATE PT_BR)';
open;
end; Só que quando tentei botar um "alter table", assim:
SqlDataSet1.Close;
with SqlDataSet1 do
begin
close;
CommandText :=
'CREATE TABLE TB_TESTE2 ('
+ 'PKCOD_TESTE2 BIGINT NOT NULL,'
+ 'NOME_TESTE2 VARCHAR(50) NOT NULL COLLATE PT_BR,'
+ 'NOME_COMPLETO_TESTE2 VARCHAR(50) COLLATE PT_BR);'
+ 'ALTER TABLE TB_TESTE2 ADD CONSTRAINT PK_TB_TESTE2 PRIMARY KEY (PKCOD_TESTE2)';
open;
end; Não funcinou, deu erro no "alter". Ainda tente fazer primeiro o create table e depois o alter como abaixo:
SqlDataSet1.Close;
with SqlDataSet1 do
begin
close;
CommandText :=
'ALTER TABLE TB_TESTE2 ADD CONSTRAINT PK_TB_TESTE2 PRIMARY KEY (PKCOD_TESTE2)';
open;
end; E também não funcinou. Ele só funcionou quando eu fiz, primeiro o create table, sem o alter, depois parei a aplicaçao, comentei o create table e rodei só o alter table, aí funcionou. Alguém saberia porque eles não funcionam juntos? Pois eu ainda pretendo criar generators e triggers desse mesmo jeito, e gostaria que fosse tudo numa tacada só. Grato pela atenção. Abraços.
Allan Ramos
Curtir tópico
+ 0
Responder
Posts
26/08/2011
Allan Ramos
Opa, eu denovo. Consegui achar uma solução e gostaria de compartilhar com vocês.
Primeiro eu criei 3 variáveis, como abaixo:
Depois eu fiz cada variável receber o seu código sql como abaixo. Aproveitei pra criar chave estrangeira no 'Create Table', pra fazer um teste e funcionou:
Depois de as variáveis estarem com seu conteúdo, fiz o ExecSQL, conforme abaixo:
Tive que fazer um procedimento por vez, senão não funcionava. Deste jeito funcionou perfeitamente. Quem precisar usar pra criar um atualizador de tabelas, está aí o código, é só implementar no que achar melhor.
Abraços.
Primeiro eu criei 3 variáveis, como abaixo:
TesteSQLTabela: String; TesteSQLGerador: String; TesteSQLTrigger: String;
Depois eu fiz cada variável receber o seu código sql como abaixo. Aproveitei pra criar chave estrangeira no 'Create Table', pra fazer um teste e funcionou:
TesteSQLTabela := 'CREATE TABLE TB_TESTE4' + '(' + 'PKCOD_TESTE4 BIGINT NOT NULL,' + 'FKCOD_TESTE1 BIGINT NOT NULL,' + 'NOME_TESTE4 VARCHAR(50) NOT NULL COLLATE PT_BR,' + 'NOME_COMPLETO_TESTE4 VARCHAR(50) COLLATE PT_BR,' + 'CONSTRAINT PK_TB_TESTE4 PRIMARY KEY (PKCOD_TESTE4),' // Chave Primária + 'CONSTRAINT FK_TB_TESTE4_1 FOREIGN KEY (FKCOD_TESTE1) REFERENCES TB_TESTE1 (PKCOD_TESTE1) ON DELETE CASCADE ON UPDATE CASCADE' // Chave Estrangeira + ')';
TesteSQLGerador := 'CREATE GENERATOR GEN_TB_TESTE4_ID';
TesteSQLTrigger := 'CREATE TRIGGER TB_TESTE4_BI FOR TB_TESTE4 '#10 + 'ACTIVE BEFORE INSERT POSITION 0 '#10 + 'AS '#10 + 'BEGIN '#10 + ' IF (NEW.PKCOD_TESTE4 IS NULL) THEN '#10 + ' NEW.PKCOD_TESTE4 = GEN_ID(GEN_TB_TESTE4_ID,1); '#10 + 'END';Depois de as variáveis estarem com seu conteúdo, fiz o ExecSQL, conforme abaixo:
SqlDataSet1.CommandText := TesteSQLTabela; SqlDataSet1.ExecSQL(False); SqlDataSet1.CommandText := TesteSQLGerador; SqlDataSet1.ExecSQL(False); SqlDataSet1.CommandText := TesteSQLTrigger; SqlDataSet1.ExecSQL(False);
Tive que fazer um procedimento por vez, senão não funcionava. Deste jeito funcionou perfeitamente. Quem precisar usar pra criar um atualizador de tabelas, está aí o código, é só implementar no que achar melhor.
Abraços.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)