ADOStoredProc

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
vipaydin
Üye
Mesajlar: 82
Kayıt: 23 Ara 2004 04:52

ADOStoredProc

Mesaj gönderen vipaydin »

Merhaba.
SQL Server 2000 kullanıyorum.
Bir formda 3-4 adet ADOSToredProc kullanacağım.
Kullandığım SP'de 1 adet Input, çok adet Output değişken var.
ADOSToredProc form üzerinde kullandığım zaman bir problem olmuyor. Sorunsuz istediğimi yapabiliyorum.
Yalnız bunları koda dökmede zorlanıyorum. Şöyle bir kod yazdım ama bu seferde Access violation hatası alıyorum.
Bu konuda yardımınıza ihtiyacım var.
Teşekkür ederim.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var ADOStoredProc1:TADOStoredProc;
begin
ADOStoredProc1.Connection:=ADOConnection1;
ADOStoredProc1.ProcedureName:='INV_AES_USER;1';
ADOStoredProc1.Parameters.ParamByName('@REF').Value:=1;
Edit1.Text:=ADOStoredProc1.Parameters.ParamByValue['@ADI'];
ADOStoredProc1.ExecProc;
end;
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

merhaba..

MSSql kullanmadım ama kodda mantık hatası var gibi..
*

Kod: Tümünü seç

'INV_AES_USER;1' 
procedure ismindeki ;1 harfleri fazlalık olabilir...
---
* Çıkış değerini ExecProc 'dan sonra almalısın....

Kod: Tümünü seç

ADOStoredProc1.ExecProc;
Edit1.Text:=ADOStoredProc1.Parameters.ParamByValue['@ADI'];
---

Kod: Tümünü seç

.ParamByValue['@ADI']
bunun sonunda Value,Asstring vb. olması lazım değil mi...?
---
Kullanıcı avatarı
vipaydin
Üye
Mesajlar: 82
Kayıt: 23 Ara 2004 04:52

Mesaj gönderen vipaydin »

Çıkış değerini ExecProc'dan sonraya alarak denedim yine olmadı.
Access violation hatası devam ediyor.
Yalnız ADOStoredProc'u form üzerinde kullanırken elle tanımlamalar yapıldıktan sonra;
Parametrelerde Değişken e ait Value Type default olarak Unassigned geliyor.
Bunu Null olarak değiştirdiğimde sorunsuz çalışıyor.
Belki de bunu koda dökemediğim için Access violation hatası alıyorum.
Acaba bir mantık hatası mı var bu işte yoksa kodlama hatası mı?
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Olmayan nesneye ulaşmaya çalıştığın zaman access violation hatası alırsın. Sen ADOStoredProc1 i tanımlamışsın var kısmında ama create etmeden ona ulaşmaya çalışmışsın, sorun burda. Çözüm olarakta ya kodla create edeceksin ya da ilgili nesneyi direk formun üzerine yerleştireceksin.
Kullanıcı avatarı
vipaydin
Üye
Mesajlar: 82
Kayıt: 23 Ara 2004 04:52

Mesaj gönderen vipaydin »

Merhaba.
Dediğiniz gibi formun üzerine ADOSToredProc componentini yerleştirdim ve kodları şöyle düzenledim.

Kod: Tümünü seç

ADOStoredProc1.Connection:=ADOConnection1;
ADOStoredProc1.ProcedureName:='INV_AES_USER;1';
ADOStoredProc1.Parameters.ParamByName('@REF').Value:=1;
ADOStoredProc1.ExecProc;
Edit1.Text:=ADOStoredProc1.Parameters.ParamValues['@ADI'];
Bu şekilde yaptığımda ise;
'ADOStoredProc1:Parameter '@REF' not found şeklinde bir hata alıyorum.
Bu componenti kod ile de değilde form üzerinde yaptığım zamanda bu şekilde bir hata alıyordum. Değişkene ait parametrelerden Value Type default olarak Unassigned geliyordu. Bunu NULL yaptığım zaman sorun kalkıyor.
Acaba bunu kod yazarken de yapmam gerekiyor mu yoksa başka bir hatam mı var anlayamadım?
Form üzerinde 2-3 adet ADOStoredProc kullanmaktaki amacım ise;
Firmaya ait bir de dönem tablosu olacak. (Yıl)
Kullanıcı şifresi ile girdiği ve çalışmak istediği dönemi seçtiği zaman ADOSToredProc'e ait ProcedureName yine SQL veritabanından gelecek bilgiye göre değişecek. Mesela INV_2005 gibi.
Bu şekilde düşünmem yanlış mı?
Üstadların yorumları benim için gerçekten önemli.
Teşekkür ederim.
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Açıkcası ben ADOSToredProc hiç kullanmadım, ADOQuery işimi görüyor. Sanırım procedure'ünden değer döndürmek istiyorsun, şöyle yapman gerekiyor:

Kod: Tümünü seç

AdoQuery1.Close;
AdoQuery1.SQL.Text := 'exec procedure_ismi parametre';
AdoQuery1.Open;
Kullanıcı avatarı
vipaydin
Üye
Mesajlar: 82
Kayıt: 23 Ara 2004 04:52

Mesaj gönderen vipaydin »

Merhaba.
Dediğiniz gibi ADOQuery kullanarak denemek istedim.
İlk önce Query Analyzer de şu şekilde yazdım.

Kod: Tümünü seç

DECLARE @RC int
DECLARE @LOG int
DECLARE @NO smallint
DECLARE @KODU varchar(20)
DECLARE @ADI varchar(25)
SELECT @LOG = 1
EXEC INV_AES_TERMINAL @LOG, @NO OUTPUT , @KODU OUTPUT , @ADI OUTPUT 
Benim istediğim alan burada @ADI alanı.
Bunu PRINT @ADI dediğim zaman doğru sonuca ulaşıyorum.
Bunu Delphi'ye taşıdığım zaman ise;

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQuery2.Connection:=ADOConnection1;
DataSource2.DataSet:=ADOQuery2;
ADOQuery2.Close;
ADOQuery2.SQL.Clear;
with ADOQuery2.SQL do
begin
Add('DECLARE @LOG int');
Add('DECLARE @NO smallint');
Add('DECLARE @KODU varchar(20)');
Add('DECLARE @ADI varchar(25)');
Add('SELECT @LOG=1');
Add('EXEC INV_AES_TERMINAL @LOG, @NO OUTPUT, @KODU OUTPUT, @ADI OUTPUT');
end;
ADOQuery2.ExecSQL;
end;
Buraya kadar herşey tamam.
Peki Edit.Text'e bu @ADI değerini nasıl atayacağım?
Valla ben bu ADOSToredProc componenti ile çok uğraştım.
Eğer ADOQuery ile sonuca ulaşırsam tüm ADOSToredProc'ları kaldıracağım form üzerinden.
Hem ADOQuery daha anlaşılır. Ne yaptığımı anlayabiliyorum.
Teşekkür ederim.
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Sen değer döndürüyormuşsun, bunun için ben ms sql serverde şöyle kullanıyorum (kodlarım yanımda değil umarım doğru hatırlıyorumdur, eğer çalışmazsa p.tesi kontrol ederim)

Kod: Tümünü seç

Add('DECLARE @LOG int');
Add('DECLARE @NO smallint');
Add('DECLARE @KODU varchar(20)');
Add('DECLARE @ADI varchar(25)');
Add('SELECT @LOG=1');
Add('EXEC INV_AES_TERMINAL @LOG, @NO OUTPUT, @KODU OUTPUT, @ADI OUTPUT'); 
Add('SELECT  @NO,@KODU,@ADI');
Open;
kolay gelsin..
Kullanıcı avatarı
vipaydin
Üye
Mesajlar: 82
Kayıt: 23 Ara 2004 04:52

Mesaj gönderen vipaydin »

Kodlarda bir sorun yok. Zaten bu kodları Query Analyzer'da çalıştırdığım zaman bir sorun çıkarmıyor.
Mesela PRINT @ADI dediğim zaman doğru sonuç karşımda.
Yalnız bunu Delphi'de bir edit text'ine yerleştirmek istiyorum.
Mesela sonucu görmek için;

Kod: Tümünü seç

ShowMessage(ADOQuery2.Parameters.ParamValues['@ADI']);
gibi bir deneme yapıyorum.
O zaman ' @ADI not found ' gibi bir hata alıyorum.
Bence burada atladığım Adoquery2 içerisinden Edit nesnesine sonucu nasıl aktaracağım.
İlginiz için de ayrıca teşekkür ediyorum.
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Procedure'ünü bir önceki mesajımda yazdığım şekilde çalıştırıyorsunuz, sizin yazdığınıza ek olarak şu satırlar vardı:

Kod: Tümünü seç

Add('SELECT  @NO,@KODU,@ADI');
Open;
(ExecSQL yerine Open kullanmalısınız).

Bundan sonra da yapmanız gereken:

Kod: Tümünü seç

EditNo.Text := ADOQuery2.Fields[0].AsString;
EditKodu.Text := ADOQuery2.Fields[1].AsString;
EditAdi.Text := ADOQuery2.Fields[2].AsString;
Bu şekilde yapıyorum ben, çalışıyor.
Cevapla