SQL Server İle ADOStoredProc Gönderen: Fatih Tarih: 09 October 2005 14:01:15
StoredProcedure Kullanmak için ADOStoredProc Bileşenini Ku0llanacağız. Kullanımı adotable,adoquery gibidir.
örneğimiz için aşağıdaki gibi kbir tablomuz olduğunu varsayıyorum.
SIRA_NO ADI KONUMU
yukarıdaki tablodan Fatih kaydını listeletelim. bunun için aşağıdaki storedprocedureyi yazalım
CREATE PROCEDURE [DBO].[SP_fatih] AS
Select * From DelphiDunyasi Where ADI='Fatih'
gördüğünüz gibi bildiğimiz sql sorgusu. sp'nin tüm kayıtları listelemesini isteseydik Where kısmını yazmamamız gerekirdi.
şimdi bunu delphide kullanalım. formunuza bir adoconnection ekleyip daha önce anlattığıım şekilde veritabanna bağlanın.forma birer Datasource, ADOstoredProc ve dbgrid ekleyin. datasourcenin dataset özelliğini adastoredproc1 olarak ayarlayın. dbgridin datasorcesine datasource1 i gösterin. gelelim adostoredproc a Connection özelliğini forma eklediğiniz adoconmnectionu gösterin.adostoredproc ProcedureName özelliğine oluşturduğumuz Stored Procedure olan sp_fatih'i gösterin. active özelliğini true yaptığınızda tıpkı query,adoquery vb. gibi veriler dbgridde görülecektir.
Parametreli Stored Procedure Kullanımı
yukarıdaki örnekte adı fatih olanlar yerine değişken bir değer kullanmak istiyorsak parametre tanımlamalıyız. aşağıdaki sp'miz Parametreye verilen değere sahip kişilerin adlarını listeleyecektir. yukarıdaki ayarların aynısını apın. adostoredproc bileşeninin active özelliğini true yapmayın. ek olarak forma bir edit ve bir button ekleyin. böylece edite girilen bilgiyi listeleyeceğiz.adostoredproc ProcedureName özelliğine oluşturduğumuz Stored Procedure olan SP_ad_bul u gösterin.
CREATE PROCEDURE [DBO].[SP_ad_bul] @ad varchar(30)
AS
Select * From DelphiDunyasi Where ADI=@ad
Buttonun Onclickine
ADOStoredProc1.Active:=false; //Active özelliğini false yapın
ADOStoredProc1.Parameters.ParamByName('@ad').Value:=Edit1.Text; // Ad parametresine edit içindeki değeri atayın
ADOStoredProc1.Active:=true; //Active özelliğini true yapın
Not : Eğer Stored Procedureniz Herhangi bir sonuç döndermiyorsa yani insert,update gibi işlem yapıyorsanız
ADOStoredProc1.Active:=true;
yerine
ADOStoredProc1.ExecSQL;
Komutunu kullanın
Ynt: SQL Server İle ADOStoredProc Gönderen: JuNK Tarih: 14 August 2006 10:35:25
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
-- ================================================
-- JUNK
-- ================================================
CREATE PROCEDURE [dbo].[JK_DB_CREATE]
(
@DBAD varchar(50)
)
AS
BEGIN
DECLARE @DBLOG varchar(200),@DBYOL varchar(200),@DBLOGYOL varchar(200)
SET @DBYOL = 'C:\KDATA\'+@DBAD+'.mdf'
SET @DBLOGYOL = 'C:\KDATA\'+@DBLOG+'.ldf'
DECLARE @SQL nvarchar(1000)
SET @SQL =
'CREATE DATABASE [@DBAD] ON PRIMARY
( NAME = N'+@DBAD+', FILENAME = N'+@DBYOL+' , SIZE = 8320KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'+@DBLOG+', FILENAME = N'+@DBLOGYOL+' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
COLLATE Turkish_CI_AS
EXEC dbo.sp_dbcmptlevel @dbname=N@DBAD, @new_cmptlevel=90
GO'
EXECUTE(@SQL);
END
-------------------------------------------------------
Dışarıdan parametrik olarak gönderdiğiniz ada yeni bir db yaratır.
Ynt: SQL Server İle ADOStoredProc Gönderen: dynamo Tarih: 25 January 2007 15:16:05
fatih hoca, ADOStoredProc komponenti ile sp den return değerlerini nasıl yakalyıp mesaj verebilirim.
sp:
create proc sp_stok_ekle
@kod varchar(20),
@ad varchar(20),
@birim varchar(20)
AS
IF EXISTS(SELECT kod FROM stok_1 WHERE kod=@kod) BEGIN
RAISERROR('Bu kayıt önceden tanımlı.Başka bir kod girin.',16,1)
RETURN
END
IF NOT EXISTS(SELECT kod FROM birim) BEGIN
RAISERROR('Kayıt Girmek için Önce Birim Tanımlayın.',16,1)
RETURN
END
insert into stok_1 values (@kod,@ad,@birim)
sp yi delphi de şu şekilde kullanıyorum:
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOStoredProc1.ProcedureName:='sp_stok_ekle';
ADOStoredProc1.Active:=false;
ADOStoredProc1.Parameters.Clear;
ADOStoredProc1.Parameters.AddParameter.Name:='@kod';
ADOStoredProc1.Parameters.AddParameter.Name:='@ad';
ADOStoredProc1.Parameters.AddParameter.Name:='@birim';
ADOStoredProc1.Parameters.ParamByName('@kod').Value:=Edit1.Text;
ADOStoredProc1.Parameters.ParamByName('@ad').Value:=Edit2.Text;
ADOStoredProc1.Parameters.ParamByName('@birim').Value:=Edit3.Text;
//ADOStoredProc1.Active:=true; //select için
ADOStoredProc1.ExecProc; //insert,update,delete için
ADOQuery1.Close;
ADOQuery1.SQL.Text:='select * from stok_1';
ADOQuery1.Open;
end;
exe yi çalıştırıp daha önce kaydedilmiş kod değerini tekrar girip kaydetmek istediğimde Windows a ait ait bir mesaj penceresinde RAISERROR deki 'Bu kayıt önceden tanımlı.Başka bir kod girin.' mesajını veriyor. benim yapmak istediğim ise bu mesaı ben kendim bir ShowMessage da kullanıcıya vermek.kaydet butonuna basınca sp deki her mesajın değerini yakalyıp ShowMessage ile mesajı kendim verip,kullanıcıyı yönlendirmak istiyorum.
aşağıdaki gibi

procedure TForm1.Button1Click(Sender: TObject);
var
mesaj:integer;
begin
ADOStoredProc1.ProcedureName:='sp_stok_ekle';
ADOStoredProc1.Active:=false;
ADOStoredProc1.Parameters.Clear;
ADOStoredProc1.Parameters.AddParameter.Name:='@kod';
ADOStoredProc1.Parameters.AddParameter.Name:='@ad';
ADOStoredProc1.Parameters.AddParameter.Name:='@birim';
ADOStoredProc1.Parameters.ParamByName('@kod').Value:=Edit1.Text;
ADOStoredProc1.Parameters.ParamByName('@ad').Value:=Edit2.Text;
ADOStoredProc1.Parameters.ParamByName('@birim').Value:=Edit3.Text;
//ADOStoredProc1.Active:=true; //select için
ADOStoredProc1.ExecProc; //insert,update,delete için
// mesaj := ADOStoredProc1 de gelen mesaj değeri <-------------------------------
if ( mesaj=1) then begin
ShowMessage('Bu kayıt önceden tanımlı.Başka bir kod girin.');
Edit1.SetFocus;
exit;
end;
if ( mesaj=2) then begin
ShowMessage('Kaydetmek için önce Birim Tanımlayın...');
frmBirim.ShowModal;
end;
ADOQuery1.Close;
ADOQuery1.SQL.Text:='select * from stok_1';
ADOQuery1.Open;
end;
Ynt: SQL Server İle ADOStoredProc Gönderen: FetihlerFatihi Tarih: 25 January 2007 17:16:23
ben olsam çıkış parametreli bir parametre tanımlarım. dönen değere göre mesaj veririm
Ynt: SQL Server İle ADOStoredProc Gönderen: dynamo Tarih: 26 January 2007 10:03:52
hocam ,dediğiniz doğru,ama ben delphi de mesajı nasıl yakalayacağımı bulamadım.

sp de @return_id smallint OUTPUT ile çıkış parametresi tanımladım:
create proc sp_stok_ekle
@kod varchar(20),
@ad varchar(20),
@birim varchar(20),
@return_id smallint OUTPUT
AS
IF EXISTS(SELECT kod FROM stok_1 WHERE kod=@kod) BEGIN
--RAISERROR('Bu kayıt önceden tanımlı.Başka bir kod girin.',16,1)
set @return_id=1;
RETURN
END
IF NOT EXISTS(SELECT kod FROM birim) BEGIN
--RAISERROR('Kayıt Girmek için Önce Birim Tanımlayın.',16,1)
set @return_id=2
RETURN
END
insert into stok_1 values (@kod,@ad,@birim)
şimdi programdan return_id ile dönen değerleri nasıl alırım?
procedure TForm1.Button1Click(Sender: TObject);
var
mesaj:integer;
begin
ADOStoredProc1.ProcedureName:='sp_stok_ekle';
ADOStoredProc1.Active:=false;
ADOStoredProc1.Parameters.Clear;
ADOStoredProc1.Parameters.AddParameter.Name:='@kod';
ADOStoredProc1.Parameters.AddParameter.Name:='@ad';
ADOStoredProc1.Parameters.AddParameter.Name:='@birim';
ADOStoredProc1.Parameters.AddParameter.Name:='@return_id';
ADOStoredProc1.Parameters.ParamByName('@kod').Value:=Edit1.Text;
ADOStoredProc1.Parameters.ParamByName('@ad').Value:=Edit2.Text;
ADOStoredProc1.Parameters.ParamByName('@birim').Value:=Edit3.Text;
ADOStoredProc1.ExecProc;
// mesaj := ADOStoredProc1 de gelen mesaj değeri <-------------------------------
mesaj:=ADOStoredProc1.Parameters.ParamByName('@return_id').Value ;
if ( mesaj=1) then begin
ShowMessage('Bu kayıt önceden tanımlı.Başka bir kod girin.');
Edit1.SetFocus;
exit;
end;
if ( mesaj=2) then begin
ShowMessage('Kaydetmek için önce Birim Tanımlayın...');
frmBirim.ShowModal;
end;
end;
burda
ADOStoredProc1.Parameters.AddParameter.Name:='@return_id';
satırını ekleyince "parametre nesnesi hatalı yada eksik" hata mesajını veriyor. bu satrı kaldırınca da "return_id bulnamadı" mesajını veriyor.şimd ne yapmam gerekiyor???
Ynt: SQL Server İle ADOStoredProc Gönderen: FetihlerFatihi Tarih: 26 January 2007 10:59:18
Not : Eğer Stored Procedureniz Herhangi bir sonuç döndermiyorsa yani insert,update gibi işlem yapıyorsanız
ADOStoredProc1.Active:=true;
yerine
ADOStoredProc1.ExecSQL;
Komutunu kullanın.
çıkış parametrelerine değeer atanmaz, active ettikten sonra alınır
Ynt: SQL Server İle ADOStoredProc Gönderen: dynamo Tarih: 29 January 2007 10:04:57
ADOStoredProc1 un ExecSQL özelliği yok ExecProc; var.
mesaj değişkenini sp den dönecek olan değeri nasıl atabilirim.??.bu şekilde kullandığımda "parametre nesnesi hatalı,uyumsuz,eksik" hata mesajını veriyor.

;

procedure TForm1.Button1Click(Sender: TObject);
var
mesaj:integer;
begin
ADOStoredProc1.ProcedureName:='sp_stok_ekle';
ADOStoredProc1.Active:=false;
ADOStoredProc1.Parameters.Clear;
ADOStoredProc1.Parameters.AddParameter.Name:='@return_id';
ADOStoredProc1.Active:=true;
mesaj:=ADOStoredProc1.Parameters.ParamByName('@return_id').Value ;