Executar comando SQL em lote - DELPHI
15/01/2018
0
Na verdade eu gostaria de executar todo o script de uma só vez. Tentei usar o IBScript mas não estou conseguindo. Então foi criado uma rotina onde leio o arquivo e vou executando cada linha de comando.
Os três primeiros comandos do arquivo sql são:
set term ^;
ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER; ^
ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC; ^
Porém ele da o seguinte erro:
Segue o código:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, WiniNet, Data.DBXFirebird, Data.FMTBcd, Data.DB, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdFTP, Vcl.Buttons, Vcl.ComCtrls, IdException, IniFiles, ShellAPI, Vcl.Samples.Gauges, System.Zip, System.UITypes, Data.SqlExpr, IdHTTP, IdAntiFreezeBase, Vcl.IdAntiFreeze, DBXCommon, IBX.IBScript; type TForm1 = class(TForm) SQLConnection1: TSQLConnection; SQLQuery1: TSQLQuery; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } procedure atualiza; procedure grava; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.atualiza; var F: TextFile; buffer: string; begin AssignFile(F, 'C:\\SAPO\\scripts\\atualizadofinal.sql'); Reset(F); Readln(F, buffer); while not eof(F) do begin with SQLQuery1 do begin // buffer := StringReplace(buffer, '^', EmptyStr, [rfReplaceAll]); LINHA COMENTADA Active := False; SQLQuery1.Close; SQLQuery1.SQL.Clear; SQLQuery1.SQL.Add(buffer); grava; end; Readln(F, buffer); end; CloseFile(F); end; procedure TForm1.Button1Click(Sender: TObject); begin atualiza; end; procedure TForm1.grava; var Trans: TDBXTransaction; begin Trans := SQLConnection1.BeginTransaction(TDBXIsolations.ReadCommitted); try SQLQuery1.ExecSQL; SQLConnection1.CommitFreeAndNil(Trans); except on E: Exception do begin SQLConnection1.RollbackFreeAndNil(Trans); MessageDlg('Erro Ao Executar Script!' + E.Message, mtError, [mbOK], 0); end; end; end; End.
Será que essa paleta não aceita esse tipo de comando?
Cayque
Post mais votado
15/01/2018
Quando você aciona o comando SQLQuery1.ExecSQL; todo o conjunto tem que estar carregado na SQLQuery1.sql.text; não pode executar linha a linha como está fazendo
Verifique se a o componente está carregado com todos os comandos quando ele for executar
set term ^; ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER; ^ ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC; ^
O código acima deve ser único.
Ou então coloque no arquivo sem as terminações " ^; " e sem o inicio " set term "
O componente já contem as caracteristicas iniciais do comando sql conforme o banco de dados que está utilizando.
Ficando assim
ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC
Luiz Vichiatto
Mais Posts
15/01/2018
Cayque
Quando você aciona o comando SQLQuery1.ExecSQL; todo o conjunto tem que estar carregado na SQLQuery1.sql.text; não pode executar linha a linha como está fazendo
Verifique se a o componente está carregado com todos os comandos quando ele for executar
set term ^; ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER; ^ ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC; ^
O código acima deve ser único.
Ou então coloque no arquivo sem as terminações " ^; " e sem o inicio " set term "
O componente já contem as caracteristicas iniciais do comando sql conforme o banco de dados que está utilizando.
Ficando assim
ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC
Certo. O acento circunflexo consigo remover tranquilo. Posso carregar todo o arquivo SQL e jogar dentro de uma StringList. Mas e depois, como eu faria pra carregar todo o arquivo SQL na SqlQuery sem executar um por um? Saberia me explicar ?
Obrigado
16/01/2018
Stewart Moura
Quando você aciona o comando SQLQuery1.ExecSQL; todo o conjunto tem que estar carregado na SQLQuery1.sql.text; não pode executar linha a linha como está fazendo
Verifique se a o componente está carregado com todos os comandos quando ele for executar
set term ^; ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER; ^ ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC; ^
O código acima deve ser único.
Ou então coloque no arquivo sem as terminações " ^; " e sem o inicio " set term "
O componente já contem as caracteristicas iniciais do comando sql conforme o banco de dados que está utilizando.
Ficando assim
ALTER TABLE TABLE_SINC ADD NR_RECORD INTEGER ALTER TABLE TABLE_SINC DROP CONSTRAINT PK_TABLE_SINC
Removi o "set term ^" e o "^" porém ta dando erro agora no "ALTER". Estranho que ele não está reconhecendo nenhum comando praticamente.
16/01/2018
Stewart Moura
Consegui executar os comando só fazendo a rotina porém quando chega nessa linha
Diz que a string foi mal formada.
O ruim disso tudo que executando direto pelo IBExpress funciona perfeitamente.
Clique aqui para fazer login e interagir na Comunidade :)