Olá a todos, meu nome é Julierme Carvalho já tinha postado aqui com criar uma procedure de inserção, atualização, e deleção no Oracle hoje vou mostra com criar esta mesma procedure no SqlServer 2005 e como executar a mesma no Delphi 2009.

Então vamos ao SqlServer  criar nossa Tabela:

 

CREATE TABLE CIDADES(

    COD_CIDADE int NOT NULL,

    NOME varchar(100),

    UF char(2)

)

 

Agora vamos criar a procedure como dito já no outro post é uma procedure simples mais para fim didático muito interessante:

 

CREATE  PROCEDURE [dbo].[SP_CIDADES] (

  @COD_CIDADE  INTEGER,

  @NOME       VARCHAR(100),

  @UF         CHAR(2),

  @OPR        CHAR(1))

as

 

BEGIN 

    IF (@OPR = 'I')

        INSERT INTO CIDADES(NOME, UF) VALUES (@NOME, @UF);

    ELSE

    IF(@OPR = 'A')

        UPDATE CIDADES SET NOME = @NOME, UF = @UF WHERE COD_CIDADE = @COD_CIDADE;

    ELSE

    IF(@OPR = 'D')

        DELETE FROM CIDADES WHERE COD_CIDADE = @COD_CIDADE;

    ELSE

        RAISERROR('ATENÇÃO! Operação diferente de I, A, D', 16, 1)

       

END ;

Para executa a procedure no Management Studio digite:

EXEC SP_CIDADES

        @COD_CIDADE = 1,

        @NOME = 'COLATINA',

        @UF = 'ES',

        @OPR ='I'

 

Vai ser inserido um registro na tabela cidades:

 

Agora vamos ao Delphi criar uma tela simples só para mostra como executar essa procedure. Vou mostrar quatro maneiras de como executar a procedure no Delphi. Coloque um componente TSQLConnection e faça a conexão com SqlServer, e mude seu nome para Conn;

Coloque um componente TSQLStoredProc mude a propriedade SQLConnection para Conn e SotoredProcName para SP_CIDADES que é o nome da procedure criada no banco de dados ex:.

imagem 1

1º ex:

No evento onclick do botão coloque assim:

procedure TForm1.Button1Click(Sender: TObject);

var

  Tran:TDBXTransaction;

begin

 

  Tran := Conn.BeginTransaction;

  ssp.Close;

  ssp.ParamByName('@COD_CIDADE').Value := edtCodigo.Text;

  ssp.ParamByName('@NOME'      ).Value := edtNome.Text;

  ssp.ParamByName('@UF'        ).Value := edtUF.Text;

  ssp.ParamByName('@OPR'       ).Value := 'I';

  ssp.ExecProc;

  Conn.CommitFreeAndNil(Tran);

   Application.MessageBox('Operação realizada com sucesso!', 'AVISO!',

      MB_APPLMODAL + MB_ICONINFORMATION + MB_OK + MB_DEFBUTTON1);

 

except

    Conn.RollbackFreeAndNil(Tran);

    Application.MessageBox('Um erro aconteceu operação cancelada!', 'ERRO!',

      MB_APPLMODAL + MB_ICONEXCLAMATION + MB_OK+MB_DEFBUTTON1);

end;

 

end;

 

No segundo exemplo vamos retira o componente TSQLStoredProc, vamos criá-lo em tem execução, nossa tela vai ficar só com a conexão como no exemplo abaixo:

imagem 2

2º ex:

No evento onclick do botão coloque o código

procedure TForm1.Button1Click(Sender: TObject);

var

  ssp: TSQLStoredProc;

  Tran:TDBXTransaction;

begin

try

  Tran := Conn.BeginTransaction;

  ssp := TSQLStoredProc.Create(nil);

  ssp.SQLConnection := Conn;

  ssp.StoredProcName := 'SP_CIDADES';

  ssp.Close;

  ssp.ParamByName('@COD_CIDADE').Value := edtCodigo.Text;

  ssp.ParamByName('@NOME'      ).Value := edtNome.Text;

  ssp.ParamByName('@UF'        ).Value := edtUF.Text;

  ssp.ParamByName('@OPR'       ).Value := 'I';

  ssp.ExecProc;

  ssp.Free;

 

   Conn.CommitFreeAndNil(Tran);

   Application.MessageBox('Operação realizada com sucesso!', 'AVISO!',

      MB_APPLMODAL + MB_ICONINFORMATION + MB_OK + MB_DEFBUTTON1);

 

except

    Conn.RollbackFreeAndNil(Tran);

    Application.MessageBox('Um erro aconteceu operação cancelada!', 'ERRO!',

      MB_APPLMODAL + MB_ICONEXCLAMATION + MB_OK+MB_DEFBUTTON1);

end;

 

end;

 

Vamos trocar de componente, através de usar o TSQLStoredProc vamos usar um TSQLDataSet,vamos trocar a propriedade name do mesmo para sds, na propriedade SQLConnection  vamos seta nossa conexão Conn e em CommandText vamos digita nossa instrução SQL para execução da procedure: EXEC SP_CIDADES @COD_CIDADE = :@COD_CIDADE, @NOME = :@NOME, @UF = :@UF, @OPR = :@OPR


imagem 3

3º ex:

No evendo onclick do botão vamos digita o seguinte:

procedure TForm1.Button1Click(Sender: TObject);

var

  Tran:TDBXTransaction;

begin

try

  Tran := Conn.BeginTransaction;

  sds.Close;

  sds.ParamByName('@COD_CIDADE').Value := edtCodigo.Text;

  sds.ParamByName('@NOME'      ).Value := edtNome.Text;

  sds.ParamByName('@UF'        ).Value := edtUF.Text;

  sds.ParamByName('@OPR'       ).Value := 'I';

  sds.ExecSQL;

 

   Conn.CommitFreeAndNil(Tran);

   Application.MessageBox('Operação realizada com sucesso!', 'AVISO!',

      MB_APPLMODAL + MB_ICONINFORMATION + MB_OK + MB_DEFBUTTON1);

 

except

    Conn.RollbackFreeAndNil(Tran);

    Application.MessageBox('Um erro aconteceu operação abortada', 'ERRO!',

      MB_APPLMODAL + MB_ICONEXCLAMATION + MB_OK+MB_DEFBUTTON1);

end;

 

end;

 

Seguindo o padrão agora vamos ver como criar o nosso TSqlDataset ou sds ou  em tempo de execução


imagem 4
4º ex:

 

No evento click do botão coloque o código

procedure TForm1.Button1Click(Sender: TObject);

var

 qry: TSQLDataSet;

  Tran:TDBXTransaction;

begin

try

  Tran := Conn.BeginTransaction;

 

  sds := TSQLDataSet.Create(nil);

  sds.SQLConnection := Conn;

  sds.CommandText := 'EXEC SP_CIDADES @COD_CIDADE = :@COD_CIDADE, '+

                     '@NOME = :@NOME,    @UF = :@UF,    @OPR = :@OPR';

  sds.Close;

  sds.ParamByName('@COD_CIDADE').Value := edtCodigo.Text;

  sds.ParamByName('@NOME'      ).Value := edtNome.Text;

  sds.ParamByName('@UF'        ).Value := edtUF.Text;

  sds.ParamByName('@OPR'       ).Value := 'I';

  sds.ExecSQL;

  sds.Free;

 

   Conn.CommitFreeAndNil(Tran);

   Application.MessageBox('Operação realizada com sucesso!', 'AVISO!',

      MB_APPLMODAL + MB_ICONINFORMATION + MB_OK + MB_DEFBUTTON1);

 

except

    Conn.RollbackFreeAndNil(Tran);

    Application.MessageBox('Um erro aconteceu operação abortada', 'ERRO!',

      MB_APPLMODAL + MB_ICONEXCLAMATION + MB_OK+MB_DEFBUTTON1);

end;

 

end;

 

Fim? Não! Faltou explicar TDBXTransaction,o que é isso? Bem ele abre uma transação com o banco repare que ele fica em bloco try except iniciando uma transação e se não houver nenhum erro ele comita a instrução no banco, se acontecer qualquer exceção ele da um rooback e abortado a instrução no banco.

Lembrando que para usar o TDBXTransaction tem dar user me DBXCommon;

Obrigado a todos!