Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Delphi içinden ve MSSQL üzerinden storeprocedure çalıştırma
#1
Öncelikle Herkesin bayramını en içten dileklerimle kutluyor sağlık mutluluk getirmesini diliyorum.

3-4 gündür uğraştığım bir anlam veremediğim bir sorunumu sizinle paylaşmak istiyorum.

SQl Server üzeirndeki store Procedure SQl managment üzerinden çalıştığında sorunsuz oalrak çalışıyor ekran çıktısı aşağıda hatta çalışıp çalışmadığını anlamak için aralara PRINT ile bazı kodlar yazdım.
VDR2Qr.png
ama aynı store procedure ü delphi içinden çağırdığımda geriye hata dönmüyor ama değer de dönmüyor daha önemlisi hiçbir yere kayıt yapmamış veya kayıt silmemiş kısaca hiç işlem yapmamış görünüyor.


Function StoreProcRun_HU(prossName : String ; subekodu , kod : integer ; subeadi : String ) : smallint ;
Begin
 With FrmSifreGiris do begin
   With AdoProc1 do
   begin
     try
     Connection := StrConnection ;
     ACtive := False;
     ProcedureName := prossName ;
     Parameters.Refresh;

     Parameters.ParamByName('@kullanici').Value := user_kullanici ;
     Parameters.ParamByName('@subekodu').Value := subekodu ;
     Parameters.ParamByName('@subeadi').Value := subeadi ;
     Parameters.ParamByName('@stokkodu').Value := kod ;

     Parameters.ParamByName('@sonuc').Value;
     Parameters.ParamByName('@sonuc').Direction := pdOutput;
     Parameters.ParamByName('@hata').Value;
     Parameters.ParamByName('@hata').Direction := pdOutput;
     ExecProc;

     if AdoProc1.Parameters.ParamByName('@sonuc').Value <> 0 then
     begin
       Application.MessageBox(Pchar('Lütfen Dikkat' + #13 + #13 + 'Üzgünüz! Ürün kartınız kaydedilemedi.' + #13 + #13 + 'Hata :' +
         AdoProc1.Parameters.ParamByName('@hata').Value ), Pchar('İşlem Tamamlanamadı.'), 0 + MB_ICONWARNING);
       result := AdoProc1.Parameters.ParamByName('@sonuc').Value ;
     end else begin
       result := AdoProc1.Parameters.ParamByName('@sonuc').Value ;
     end;
     except
       on e:exception do begin
         ShowMessage('SQL :' +  e.Message);
       end;
     end;
   end;
 end;
End;


Buda Store Procedure

ALTER PROCEDURE [dbo].[H_SubeyeUrunAktarimi] (
@subekodu as int , 
@subeadi as nvarchar(50) ,
@stokkodu as int , 
@kullanici as nvarchar(30),
@sonuc as int output , 
@hata as nvarchar(MAX) output
)
AS
BEGIN
DECLARE @sSQL	NVarchar(max)
DECLARE @Sure as int

DECLARE @linkserver nvarchar(50) , 
	@catalog nvarchar(50)
DECLARE @linkedmerkez nvarchar(30) , 
	@linkedsube nvarchar(30),
	@katalog as nvarchar(50)

 SET @linkedmerkez = '[MERKEZ]'
 Set @sonuc=0

BEGIN 	TRY
 SET @sSQL = ' Select  @linkserver = linkserver , @katalog = katalog  From SubeTanimlari Where subekodu= '  + CAST (@subekodu as nvarchar)
 EXEC sp_ExecuteSQL @sSQL  , N'@linkserver  nvarchar(50)  OutPUT , @katalog nvarchar(50) OUTPUT ' , @linkserver  OUTPUT  , @katalog  OUTPUT
 SET @Hata=@Hata + ' Linkserver :  '  + @linkserver + ' /  katalog : '   +  @katalog 

 SET @linkedsube = '['+@linkserver+'].[' + @katalog + ']'
 PRINT 'linkedsube : '  + @linkedsube

{ Burası çalıştığında işlem bağlamı başka bir oturum tarafındna kullanılıyor diye hata veriyor. ne oluyor bilmiyorum ama hata geri dönmüyor.}
 SET @sSQL = ' DELETE FROM ' + @linkedsube + '.dbo.UrunKartlari Where stokkodu = ' + Cast(@stokkodu as nvarchar)
 EXEC  sp_executesql  @sSQL
}

 
 PRINT  'DELET SQL : '  + @sSql 
 PRINT 'Sonuc : ' +  CAST(@@ROWCOUNT as nvarchar)

 IF @@ERROR = 0  BEGIN
   SET @sSQL = ' INSERT INTO ' + @linkedsube  + '.dbo.Urunkartlari   (stokturu_i, aktif, bagli, sor, ureticikodu, ureticigurubu, stokkodu, stokadi, urungurubu, kdv, birimi, birimi_t, sirano, sube, ozelyetki, fiyatdegismez, isimdegismez, urungurubudegismez, urungorselidegismez, satisgorunmesin, gorsel, kayittarihi, songuncelleme, recete, listedeciksin)  ' 
   SET @sSQl = @sSQL  + '  SELECT  stokturu_i, aktif, bagli, sor, ureticikodu, ureticigurubu, stokkodu, stokadi, urungurubu, kdv, birimi, birimi_t, sirano, sube, ozelyetki, fiyatdegismez, isimdegismez, urungurubudegismez, urungorselidegismez, satisgorunmesin, gorsel, kayittarihi, songuncelleme, recete, listedeciksin FROM  ' + @linkedmerkez + '.dbo.Urunkartlari '
   SET @sSQl = @sSQL  + '  Where stokkodu =  ' + Cast(@stokkodu as nvarchar)
   EXEC  sp_executesql @sSQL
   PRINT  ' INSERT Sonuc : ' + CAST(@@ROWCOUNT as nvarchar)
 END

 PRINT 'Hata : '  + @HATA
 SET @Sonuc=@@ERROR


 IF  @@ERROR=0 
   INSERT INTO LGDegisiklik ( islemturu, stokkodu, kullanici, subekodu, subeadi, sure, sonuc) Values ('HU', @stokkodu , @kullanici ,  @subekodu ,  @subeadi , @sure  , @@ERROR)
 ELSE
   INSERT INTO LGDegisiklik ( islemturu, stokkodu, kullanici, subekodu, subeadi, sure, sonuc) Values ('HU', @stokkodu , @kullanici ,  @subekodu ,  @subeadi , @sure  , 1 )

 PRINT ' INSERT LOG '  +  CAST(@@ROWCOUNT as nvarchar)

END TRY
BEGIN CATCH
    SET @hata=@hata + ' [  '  + ERROR_MESSAGE() + '  ]  '
	RAISERROR ('Hata Oluştu : ' ,16,1)	
END CATCH
	
	
END

Delphi içinden Debug yaparken şöyle birşey gördüm . . Yukarıda kodun içine yazdım böyle bir hata  {  "İşlem bağlamı başka bir oturum tarafından kullanılıyor" } bunula ilgili bir araştırma yaptım öncelikle 
Service hizmetinden Dağıtılmış İşlem Düzenliyicisinin çalışması gerekiyor diye yazmış bende çalışmıyordu ama yinede SQl server üzerinden sorunsuz olarak kayıt yapıyordu , yinede çalıştırdım onu çalıştırdıktan sonra bu hatayı vermeye başladı o stop  durumda iken SQl server içinden yine sorun yok fakat store procedure ile delphi den çalıştırdığımda "msdtc on server is unavailable" hatası veriyordu .
Cevapla
#2
Valla konu gittikçe ilginç bir hal aldı bende paylaşayım dedim ama şimdi bu store procedure bir butona tıklandığında çalışması için seçilirse sorunsuz çalışıyor ama 2-3 işlemin arkasına eklendiğinde çalışmıyor , nasıl bir iştir anlamadım acaip bir hal aldı
Cevapla
#3
Hiç böyle bir hatayla karşılaşmadım fakat sanki o tabloda işlem yapılırken DELETE atıyormuşsun onun sonucunda engelliyormuş gibi geldi bana
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla
#4
Ben sp'leri genelde connection nesnesinden çalıştırmayı tercih ediyorum.

AdoConnection1.Execute ('EXEC spSubeyeAktar subekod=3, subead="aaaaa", ....');

Tabi parametreler denetlenmiyor ama durum ve tercih meselesi.
Cevapla
#5
Sql Server'da INSERT, UPDATE ya da DELETE işlemleri yapan stored procedure'ler bu işlemlerden kaç kaydın etkilendiğini bildiren bir satır yazarlar. (10 rows affected gibi) Ve bazen bu, TADOStoredProc tarafına bir recordset olarak döner. Buna engel olmak için her daim; INSERT, UPDATE ve DELETE stored procedure'lerinin üstüne SET NOCOUNT ON; ibaresini ekleyiniz.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#6
Ayrıca gördüğüm kadarı ile, Linked server vasıtası ile başka bir sunucu üzerindeki veritabanına erişiyor ve onunla işlem yapıyorsunuz. Bu durumda, hata mesajında da belirttiği gibi dağıtık transaction yapısından istifade edebilmek için ilgili servisin (MSDTC = Distrubuted Transaction Coordinator) çalışıyor durumda olması lazım.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#7
(28-08-2018, Saat: 14:14)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Ayrıca gördüğüm kadarı ile, Linked server vasıtası ile başka bir sunucu üzerindeki veritabanına erişiyor ve onunla işlem yapıyorsunuz. Bu durumda, hata mesajında da belirttiği gibi dağıtık transaction yapısından istifade edebilmek için ilgili servisin (MSDTC = Distrubuted Transaction Coordinator) çalışıyor durumda olması lazım.

Cevap için teşekkülrer öncelikle  , MSDTC Aktif zaten işlemi SQL manager da yaptığımda sorunsuz çalışıyor idi , İçinden çıkılmaz bir hal aldı ve uzun sürdü bende çözümü yapıyı ve mantığı değiştirmekte buldum şimdilik .

Herkese çok teşekkürler.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  delphi 10.4 deutsch1988 0 62 Dün, Saat: 11:46
Son Yorum: deutsch1988
  Delphi virus gibi deutsch1988 11 478 12-04-2024, Saat: 17:36
Son Yorum: deutsch1988
  Delphi 7 Unrar mcuyan 12 669 19-03-2024, Saat: 10:30
Son Yorum: frmman
Lightbulb Delphi 7zip Password lü Dosya Sıkıştırma ve Açma + Bonus RAR5 Desteği frmman 6 318 16-03-2024, Saat: 17:55
Son Yorum: delphi.developer
  delphi 12 ile TFileStream çalışmıyor aegean 5 527 05-03-2024, Saat: 22:23
Son Yorum: aegean



Konuyu Okuyanlar: 1 Ziyaretçi