Ajuda - Busca - Membros - Calendário
Versão Completa: Acessar banco de dados
Fórum Script Brasil > Programação & Desenvolvimento > Delphi, Kylix
dirleimoreira
Bom dia...

Estou com um pequeno problema... presciso fazer um codigo que acesse o banco de dados e copie uma tabela com outro nome, mas como sou novo no delphi não estou conseguindo... gostaria se possivel alguém me ajudasse com isso...



Tambem gostaria de saber se tem como acessar ela por codigo... tipo um script
flavioavilela
como assim, copiar uma tabela com outro nome??? você quer dizer que você quer pegar os dados de uma tabela e copiar para outra com os mesmos campos, só que, com outro nome??? se não, explica melhor para ver se posso lhe ajudar...
dirleimoreira
então e assim... eu presciso entrar no db no qual estou usando um firebird, copiar uma tabela e essa copia gostaria de por ela com outro nome...


So que fora isso estou com muita dificuldade de conseguir mexer no db pelo delphi7, tentei usar hoje o IBO 4.9.9 para fazer a conexão, porem não esta dando certo...


Existe alguma string que eu possa utilizar para conectar??? ou vou ter q mesmo usar esses complementos tipo o IBO???


flavioavilela
boa noite amigo...

imagino que você está tendo dificuldades em ligar o bd ao delphi, devido que as vezes ele não tem driver nativo... no meu caso, utilizo sql server... ele já possui driver nativo no delphi, logo, é moleza...

quanto a copiar a tabela de um banco para outro, eu tenho aqui um utilitário que fiz para pegar dados de um bd de algum programa e passar para o meu... eu faço da seguinte forma:
crio 2 ADOConnection (utilizo componentes ADO)... um com meu banco e outro com o banco do cliente... ai, crio ADOQuery's com os dados da tabela do meu bd e outro(s) com dados da tabela do bd do meu cliente... a partir dai, eu pego e faço:

CODE
ADOQueryMeuBDCampo_Desejado1.AsString:= ADOQueryBDMeu_ClienteCampo_Desejado1.AsString;
ADOQueryMeuBDCampo_Desejado2.AsString:= ADOQueryBDMeu_ClienteCampo_Desejado2.AsString;


ou vice-versa... e por ai vai...
quanto ao firebird, imagino que o delphi não terá driver nativo, logo, terá que achar na net... eu não sei te dizer o link (faz tempo que baixei), mas tenho aqui um driver ODBC para o firebird... procure no google por
QUOTE
Firebird_ODBC_2.0.0.148_win32
que encontrará... ai você instala e no ADOConnection encontrará o firebird...

se isso tudo que lhe falei agora não for o que você solicitou, vai uma dica: para copiar uma tabela para outra (nova), não sei qual banco você utiliza, mas no sql server faço assim, mas imagino que a sintaxe não foge muito disso:

CODE
SELECT * INTO NomeNovaTabela FROM TabelaExistente WHERE 1=1

só para explicar: nessa sintaxe ele pega tudo (até a extrutura) da TabelaExistente e copia para a NomeNovaTabela...
QUOTE
WHERE 1=1
significa que além da estrutura, os dados também serão copiados... se colocar
QUOTE
WHERE 1=0
, copiará apenas a estrutura...

espero ter ajudado...
dirleimoreira
obrigado... tentarei achar o driver... se der certo eu posto aqui denovo.
dirleimoreira
Bom dia,


Consegui conectar no db pelo ado... mas adora não sei como colocar esse comando do firebird em delphi:

"
CREATE TABLE CIDADE
(
ID_CIDADE INTEGER NOT NULL,
CID_NOME VARCHAR(50) CHARACTER SET WIN1252 NOT NULL
COLLATE PXW_INTL850,
CID_UF CHAR(2) CHARACTER SET WIN1252 COLLATE PXW_INTL850,
CONSTRAINT PK_CIDADE PRIMARY KEY (ID_CIDADE)
);
"

Teria como executar os comandos do firebird pelo delphi em um button???
dirleimoreira
Ola consegui fazer um codigo para o db não qual ele entra é criar um tabela segue abaixo:


QUOTE
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ADODB, DB, StdCtrls;

type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
ADOTable1: TADOTable;
Button1: TButton;
ADOCommand1: TADOCommand;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var L:TStringList;
begin
{A classe TStringList é utilizada para armazenar e manipular
uma lista de strings. Através do método Add da classe é possível
inserir uma nova string a lista}

//criando Stringlist na memória
L := TStringList.Create;
//pega o nome da tabela
ADOConnection1.GetTableNames(L);
//pega a posição do tbteste(começa no 0)
if L.IndexOf('tbteste') >= 0 then
begin
Showmessage('Esta tabela já existe no BD!');
Abort
end
else
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('create table tbteste(');
ADOQuery1.Sql.Add('cod_teste integer not null primary key, ');
ADOQuery1.Sql.Add('nome_teste varchar(40))');
ADOQuery1.ExecSQL;
L.Free;
ShowMessage('Tabela Criada com sucesso!');
end;
end;
end.




Agora gostaria da sua ajuda para fazer esse codigo copiar uma tabela chamada menu ou tentar renomea- la... que assim o programa que estou tentando fazer tem q excluir essa tabela menu ou alterar o nome , para que um outro programa não funcione...
flavioavilela
bom, para copiar a tabela, com todos os dados e estrutura, já postei anteriormente... coloca ela numa ADOQuery e manda vê...

CODE
SELECT * INTO NomeNovaTabela FROM TabelaExistente WHERE 1=1


para renomear, faz assim (a mesma idéia, coloca na ADOQuery)...

CODE
ADOQuery1.Close;
ADOQuery1.Connection := Seu_ADOConnection;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('EXEC sp_rename TabelaNova, TabelaVelha');
ADOQuery1.ExecSQL();


espero ter ajudado
dirleimoreira
esse "ADOConnection1:" seria o nome do driver de conexao que eu instalei???
mais uma coisa... estava tentando fazer um pequeno codigo pra excluida a tabela depois, segue abaixo


QUOTE
procedure TForm1.Button1Click(Sender: TObject);
var L:TStringList;
begin

L := TStringList.Create;

ADOConnection1.GetTableNames(L);

if L.IndexOf('0MENU') >= 0 then
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.text := ( 'drop table 0MENU');
ADOQuery1.ExecSQL;
L.Free;
Showmessage('tabela excluida!');
end;
end;
end.


vo que não esta funcionando... esta faltando alguma coisa nele??
flavioavilela
o ADOConnection é o componente que liga o delphi ao bd... não é o driver de conexão e sim o componente que "recebe" esse driver e que liga, a grosso modo dizendo, o delphi ao banco... ele está na paleta dbGo, no meu caso aqui é o delphi 2010...

para deletar a tabela, faça:

CODE
DROP TABLE Nome_Tabela


pelo que vi ai, sua tabela chama Menu e você colocou no Drop Tabela 0Menu....
dirleimoreira
Assim, no db eu tenho 3 tabelas menus: 0MENU,1MENU e MENU, eu so estou conseguindo excluir a tabela MENU com esse codigo, quando eu tento para as outras 2 não da certo....

flavioavilela
que mensagem aparece? pode ser que esses caracteres sejam especiais para o seu bd... tente mudar o nome delas, colocando caracteres "normais"
dirleimoreira
tirei um ss do erro: segue abaixo




quando eu so exclui a tabela MENU não da erro, mais se eu excluo a tabela 0MENU ou a 1MENU gera o erro acima

flavioavilela
seu objeto L, que é uma StringList, você cria ela no inicio... beleza...
quando você passa o primeiro comando para deletar a tabela Menu, ele deleta... só que, logo após isso, você libera da memória o L, com L.Free.... e logo após, você chama o L (que já está destruído) novamente para deletar o 1Menu... experimenta colocar o L.Free no final de tudo, após deletar a última tabela.... ou após liberar com L.Free e ao criar novamente o método para deletar o 1Menu, criar o L novamente com L:= TStringList.Create;

ou você pode criar um objeto StringList L1, L2, L3... enfim... um para cada tabela que deseja deletar... ai sim, você cria o L1, por exemplo, passa o comando para deletar e destroi com L1.Free. ai você cria o L2, passa o comando para deletar e destroi com L2.Free... e por ai vai...

espero ter ajudado...
dirleimoreira
vou tentar... qualquer coisa aviso

olha eu tentei seguir sua idea, segue abaixo:

CODE
procedure TForm1.Button1Click(Sender: TObject);
var L:TStringList;
L2:TStringList;
begin

L := TStringList.Create;

ADOConnection1.GetTableNames(L);

//pega a posição do tbteste(começa no 0)
    if L.IndexOf('MENU') >= 0 then
      begin
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Text := ( 'drop table MENU');
      ADOQuery1.ExecSQL;
      L.Free;
      Showmessage('tabela menu excluida');
      end;

L2 := TStringList.Create;
ADOConnection1.GetTableNames(L2);
      if L2.IndexOf('0MENU') >= 0 then
      begin
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Text := ( 'drop table 0MENU');
      ADOQuery1.ExecSQL;
      L2.Free;
      Showmessage('tabela 0MENU excluida');
      end;

end;
end.



Porem continua dando o mesmo erro, so que eu fiz um teste, se eu tentar dropa outra tabela sem ser OMENU e 1MENU funciona normal....
flavioavilela
bom, imagino que já seja uma questão de lógica esse caso... você verificou se as tabelas que não estão deletando tem algum relacionamento com outras tabelas? está sendo usada por outra ou algo parecido?
experimente fazer um breakpoint, para ver realmente em qual linha está dando o erro, as vezes fica mais fácil saber onde está o erro... você pode também, a título de testes, colocar só assim:

CODE
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text := ( 'drop table 0MENU (ou qualquer outra que quiser... bom tentar fazer com as tres');
ADOQuery1.ExecSQL;

sem nenhum tipo de validação, só para ver se vai dar o erro ou não... tente fazer esses dois testes ai... esse que coloquei em código e o breakpoint...
dirleimoreira
então o program esta copilando normal, so esta dando aquele erro quando você roda a aplicação... e as tabelas 0MENU e 1MENU acho q não tem ligação, pois consigo deletar elas pelo IBexpert...
flavioavilela
tente deletar qualquer tabela só com esse comando:
CODE
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text := ( 'drop table 0MENU (ou qualquer outra que quiser... bom tentar fazer com as tres');
ADOQuery1.ExecSQL;


outra coisa... eu digo pra você fazer um breakpoint, funciona assim: supondo que seja um botão que você aperta para executar esse comando... vai na janela de codificação e posiciona o cursor na primeira linha (excluindo a linha que cria a procedure, que cria variaveis e etc, a primeira linha "valida") e pressione F5... você vai ver que vai aparecer uma bolinha vermelha do lado esquerdo.......... dai, executa a aplicação... quando você clicar no botão para executar o comando desejado, o foco vai parar em cima dessa linha que você escolheu e pressinou F5... dai, você vai pressionando F8 para prosseguir com o cursor... dai, você vai saber em qual linha de comando ele vai dar o erro... dai você posta ai qual a linha que deu erro ou então já vai sacar na hora porque que está dando erro..... sacou???

espero ter ajudado... qualquer coisa, posta ai...
dirleimoreira
conseguir achar o erro, tinha q colocar assim pra excluir

QUOTE
ADOQuery1.SQL.Text := ( 'DROP TABLE "MENU";');


foi sem dar erro agora...


Agora oque estou tentando fazer é copiar essas tabelas e por outro nome nelas para depois excluir...

ah muito obrigado pela ajuda...


vo tentar fazer aqui é depois posto...

flavioavilela
ok, viu como o recurso do breakpoint ajuda e muito rsrsrs...???

quanto a copiar, excluir ou renomear as tabelas, eu já postei anteriormente, mas, qualquer coisa, posta ai...

espero ter ajudado...
dirleimoreira
olha tentei seguir o que você passou para copiar a tabela depois exclui, so que não deu certo, segue abaixo:


CODE
if L.IndexOf('1MENU') >= 0 then
      begin
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Text := ('SELECT * INTO 1MENU02 FROM 1MENU WHERE 1=1 ');
      ADOQuery1.SQL.Text := ( 'DROP TABLE "1MENU";');
      ADOQuery1.ExecSQL;
      end;



o que eu fiz errado???
flavioavilela
pelo que vi, tem um ; logo após o "1Menu", na linha do drop... como disse anteriormente, faça um breakpoint e veja em qual linha está o erro... ai você posta em qual linha está ou você mesmo já ve o que está de errado... acabei de fazer um teste aqui sem o ; deu tudo certo...
dirleimoreira
então aqui se eu tirar o ; não compila o programa... e com o ; ele roda mas, não esta criando a tabela 01MENU02...
dirleimoreira
então fiz um codigo so para copiar a tabela e esta gerendo erro segue a imagem abaixo:



não sei onde esta dando erro
flavioavilela
bom, acabei de fazer outro teste pelo delphi, fiz assim:

CODE
var
    qAux: TADOQuery;
begin
  qAux:= TADOQuery.Create(self); //estou criando a query em tempo de execução, mas, pode-se colocar igual está fazendo
  with qAux, sql do
  begin
    close;
    Connection:= dm.ADOConnection1;
    clear;
    add('select * into Teste2 from teste where 1=1');
    ExecSQL;
  end;
end;


faça rigorosamente igual eu fiz, veja se da certo... eu acabei de testar, funcionou perfeitamente... faça igual, sem tirar sem por nada.... crie uma tabela chamada teste e faça igual o código acima...... depois, troca o nome das tabelas (para o nome das suas), apenas isso e veja se da certo... é pra funcionar, pois aqui funcionou perfeitamente....

outra coisa... o meu banco é sql server, o seu, pelo que vi é firebird... pode ser que a sintaxe seja diferente...

tente assim:

CODE
Insert into <TABELA_Destino> (<Campo1>, <Campo2>, .. , <Campon>) Select <Campo1>, <Campo2>, .., <Campon> From <Tabela_Origem>


alterando o nome da tabela de origem e destino e os campos..
dirleimoreira
mas me tira um duvida... eu presciso criar um outra tabela com so mesmo campos para copiar o menu???
flavioavilela
não, você tem que ter so a origem... o destino a rotina cria sozinha...
dirleimoreira
então eu tenho q so criar uma tabela chama MENU02, que o comando importa os campos do outra???
flavioavilela
funciona assim... independente pra qualquer tabela... você tem uma tabela chama Teste... você quer criar uma cópia da teste... ai você faz esses comandos que lhe passei de copiar tabela que ele cria a cópia da Teste para outro nome que você colocar no comando...
dirleimoreira
vou tentar fazer aqui então... qualquer coisa posto aqui
dirleimoreira
bom dia, tentei fazer o codigo para copiar a tabela do jeito q você me disse segue abaixo:


CODE
procedure TForm1.Button1Click(Sender: TObject);
var L:TStringList;
  begin
  L := TStringList.Create;
  ADOConnection1.GetTableNames(L);
    if L.IndexOf('MENU') >= 0 then
      begin
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.text :=('Insert into MENU02 (DESCRICAO, CHAVE, ICONE, LIBERADO, ORDEM) Select DESCRICAO, CHAVE, ICONE, LIBERADO, ORDEM FROM MENU');
      ADOQuery1.ExecSQL;
      L.Free;
    ShowMessage('Tabela Criada com sucesso!');
   end;

  end;

end.



Porem não esta funcionando... não sei onde esta o erro...
dirleimoreira
já achei o erro XD... obrigado
Esta é uma versão simplificada de nosso conteúdo principal. Para ver a versão completa com maiores informações, formatação e imagens, por favor clique aqui.
Invision Power Board © 2001-2012 Invision Power Services, Inc.