Fórum Multiplos comandos (insert / update) #381344

13/07/2010

0

Boa tarde.
  Gostaria de saber como executar comando insert ou update com diversos registros em um banco firebird.
  Eu consigo executar uma instrução como segue abaixo em bancos sqlserver, porem em firebird não dá certo:

  insert into table
  (cod, nome)
  values(1,'devmedia');
  insert into table
  (cod, nome)
  values(1,'devmedia');
  insert into table
  (cod, nome)
  values(1,'devmedia');
  insert into table
  (cod, nome)
  values(1,'devmedia');
  insert into table
  (cod, nome)
  values(1,'devmedia');
  insert into table
  (cod, nome)
  values(1,'devmedia');

  Então, eu faço algo desse tipo em sqlserver e tudo bem...lembrando que preciso executar comandos de uma aplicação delphi através de uma query.

Obrigado
Mais Dominio

Mais Dominio

Responder

Posts

13/07/2010

Wesley Yamazack

Olá amigo,

  Em firebird, você usa que ferramente para administrar ? O IBExpert ? Se for vai no menu Tools / Scrips Execute, e coloca o teu scritp, separado por ; cada comando, e depois mande executar.

  Agora se você for fazer isso no Delphi, você vai ter que fazer uma rotina mais ou menos parecida com a abaixo :


procedure TForm2.FormCreate(Sender: TObject);
var
  xIDUF, xDescxricao : String;
begin
  SQLQuery1.Close;
  SQLQuery1.SQL.Clear;
  SQLQuery1.SQL.Add('INSERT INTO UF ( IDUF, DESCRICAO ');
  SQLQuery1.SQL.Add(' VALUES (' + xIDUF + ', ' + QuotedStr(xDescxricao) + ')');
  SQLQuery1.ExecSQL;
end;

QuotedStr - Serve para colocar os '' quando for Varchar exempo 'RJ', 'SP'

Era isso ?

Att,

Wesley Y
Responder

Gostei + 0

16/07/2010

Mais Dominio

Oi Wesley.
  Não é isso não...eu preciso fazer o seguinte:
  Eu tenho que gravar diversos registro em um banco de dados na web. Para isso eu seleciono as informações locais e executo um insert ou update por vez. O que eu quero é com um unico ExecSql da query gravar diversos registros no banco.
  Com o SQLServer eu faço isso normalmente, mas já tentei fazer da mesma forma com o Firebird e não consegui, inclusive com o SQLServer eu colocava até 300 linhas de Insert e dava apenas um ExecSql na Query e ele gravava todos de uma vez no banco.

  Entendeu?
Responder

Gostei + 0

16/07/2010

Wesley Yamazack

Valter

   Qual erro que acontece no Firebird ? Qual rotina vocÊ esta fazendo ? Mande o código para poder analisar.

Responder

Gostei + 0

19/07/2010

Mais Dominio

Bom dia Wesley.
  Por exemplo, se tento executar diversos inserts pelo IBO da tudo certo, porem quando tento transportar a técnica para ser executada por um ocmponente IBQuery eu não consigo.
  Segue um exemplo do que estou tentando fazer:

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  IBQuery1.SQL.Text:=
   'INSERT INTO CADCODIGOLANCAMENTOS '
   +'(NRCTRCODLAN, CDDES, DSDES, DTCADDES)'
   +' VALUES'
   +'(5,'+QuotedStr('0005')+','+QuotedStr('DESPESA5')+','+QuotedStr('07/15/2010')+');'

   +'INSERT INTO CADCODIGOLANCAMENTOS '
   +'(NRCTRCODLAN, CDDES, DSDES, DTCADDES)'
   +' VALUES'
   +'(6,'+QuotedStr('0006')+','+QuotedStr('DESPESA6')+','+QuotedStr('07/15/2010')+');'

   +'INSERT INTO CADCODIGOLANCAMENTOS '
   +'(NRCTRCODLAN, CDDES, DSDES, DTCADDES)'
   +' VALUES'
   +'(7,'+QuotedStr('0007')+','+QuotedStr('DESPESA7')+','+QuotedStr('07/15/2010')+');';

  IBQuery1.ExecSQL;
  IBTransaction1.CommitRetaining;

end;


  Dá um erro de execução, entendeu?
Responder

Gostei + 0

20/07/2010

Wesley Yamazack

Olá amigo,

     Veja abaixo que fiz uma modificação inclui no seu código uma lista de comandos, nele você adiciona todos os seus comandos, e ao final executa um Loop em cima dos itens desta lista, e somente no final da o Commit, sacou a idéia ?   procedure TForm1.Button1Click(Sender: TObject); Var ListaComandos : TStringList; I : Integer; begin    ListaComandos := TStringList.Create;    ListaComandos.Add(    'INSERT INTO PONTOFUNCAO '    +'(IDPONTOFUNCAO, DESCRICAO)'    +' VALUES'    +'(15,'+QuotedStr('A')+'); ');    ListaComandos.Add(    'INSERT INTO PONTOFUNCAO '    +'(IDPONTOFUNCAO, DESCRICAO)'    +' VALUES'    +'(16,'+QuotedStr('B')+'); ');    ListaComandos.Add(    'INSERT INTO PONTOFUNCAO '    +'(IDPONTOFUNCAO, DESCRICAO)'    +' VALUES'    +'(17,'+QuotedStr('C')+');');    for I := 0 To ListaComandos.Count -1 do    begin       IBQuery1.SQL.Text:= := ListaComandos.Strings[I];       IBQuery1.ExecSQL;    end;      IBTransaction1.CommitRetaining; end;     Um abraço Wesley Y  
Responder

Gostei + 0

20/07/2010

Mais Dominio

Oi Wesley.
  Isto que você fez no seu código já é a mesma coisa que eu faço, não é isso que preciso cara...desta forma que vc mostrou eu vou ter que dar um comando Exec pra cada registro, o que eu gostaria era poder fazer apenas um único comando ExecSql e gravar todos os registros de uma vez, como eu disse se vc fizer isso pelo IBO separando cada insert por ponto e virgula(;) ele executa normalmente mas pelo delphi não, entendeu?


Responder

Gostei + 0

20/07/2010

Wesley Yamazack

Olá amigo,

   O comando ExecSQL, será executado várias vezes, porém só será confirmado no banco de dados através de uma transação, por isso a mesma está fora do Loop, ou seja será disparado o commit com todos os registros adicionados, isso não lhe atende ? Seu problema é qual com relação a esta solução ?

   Fiz seu exemplo também e não funcionou, devido a ter mais de um comando a ser executado, no Firebird, mesmo se você tentar executar mais de um comando na janela "SQL Edit"(IBExpert), ele irá dar erro, você deve executar comando por comando, na ferramenta IBExpert, tem uma opção onde você carrega um script, mas isso já é uma opção que existe na ferramenta.


  Como perguntei antes, qual seria o problema de usar este artifício ?


Att,

Wesley Y
Responder

Gostei + 0

22/07/2010

Mais Dominio

Oi Wesley.
  Acontece que quando gero diversas linhas de comandos e dou apenas um único comando execsql é mais rápido, por exemplo, eu já montei até 300 linhas de insert e mandei gravar e o processo foi muito rápido, eu apenas gostaria de fazer dessa mesma forma pelo Firebird, como eu disse no sqlserver funciona.
Responder

Gostei + 0

22/07/2010

Wesley Yamazack

Olá amigo,


Em Delphi, pesquisando por aqui não consegui achar uma solução, pois segundo informações, esta é uma limitação dos componentes, eles não permitem executar mais de um comando em Delphi, se você pegar os componentes e fazer o Scritps para SQLServer, como você falou que funciona, não irá funcionar, mas no seu banco funciona, correto ?

Utilizando o ExeSQL, junto com as transações não ficará lento, pois todas as informações serão enviadas pra o banco de uma única vez. saca ? Espero que tenha ajudado

Att,

Wesley Y
Responder

Gostei + 0

30/07/2010

Wesley Yamazack

Olá amigo, chegou a ver meu último post?

Att,

Wesley Y
Responder

Gostei + 0

06/08/2010

Wesley Yamazack

Estamos fechando seu chamado por falta de retorno, qualquer dúvida basta postar o mesmo que reabrimos o chamado.


Att,

Wesley Y
Responder

Gostei + 0

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

Aceitar