Arşiv Anasayfa SQL Server
Sayfalar: 1
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  Huh

:

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. Sad

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.  Undecided Angry  ;Huh

:

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   ;