Fórum Multiplos comandos (insert / update) #381344
13/07/2010
0
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
Curtir tópico
+ 0Posts
13/07/2010
Wesley Yamazack
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
Gostei + 0
16/07/2010
Mais Dominio
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?
Gostei + 0
16/07/2010
Wesley Yamazack
Qual erro que acontece no Firebird ? Qual rotina vocÊ esta fazendo ? Mande o código para poder analisar.
Gostei + 0
19/07/2010
Mais Dominio
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?
Gostei + 0
20/07/2010
Wesley Yamazack
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
Gostei + 0
20/07/2010
Mais Dominio
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?
Gostei + 0
20/07/2010
Wesley Yamazack
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
Gostei + 0
22/07/2010
Mais Dominio
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.
Gostei + 0
22/07/2010
Wesley Yamazack
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
Gostei + 0
30/07/2010
Wesley Yamazack
Att,
Wesley Y
Gostei + 0
06/08/2010
Wesley Yamazack
Att,
Wesley Y
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)