Multiplos comandos (insert / update)
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
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
Curtidas 0
Respostas
Wesley Yamazack
13/07/2010
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
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
Mais Dominio
13/07/2010
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?
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
Wesley Yamazack
13/07/2010
Valter
Qual erro que acontece no Firebird ? Qual rotina vocÊ esta fazendo ? Mande o código para poder analisar.
Qual erro que acontece no Firebird ? Qual rotina vocÊ esta fazendo ? Mande o código para poder analisar.
GOSTEI 0
Mais Dominio
13/07/2010
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?
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
Wesley Yamazack
13/07/2010
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
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
Mais Dominio
13/07/2010
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?
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
Wesley Yamazack
13/07/2010
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
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
Mais Dominio
13/07/2010
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.
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
Wesley Yamazack
13/07/2010
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
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
Wesley Yamazack
13/07/2010
Olá amigo, chegou a ver meu último post?
Att,
Wesley Y
Att,
Wesley Y
GOSTEI 0
Wesley Yamazack
13/07/2010
Estamos fechando seu chamado por falta de retorno, qualquer dúvida basta postar o mesmo que reabrimos o chamado.
Att,
Wesley Y
Att,
Wesley Y
GOSTEI 0