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.
Obrigado a todos!