sorgu zaman aşımına uğradı..

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

sorgu zaman aşımına uğradı..

Mesaj gönderen ikutluay »

Merhaba

Kod: Tümünü seç

Provider=SQLOLEDB.1;Password=xxx;Persist Security Info=True;User ID=dlp;Initial Catalog=MikroDB_V14_DEKOR2011;Data Source=192.168.1.9;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;
connection stringim var. proje başlarken

Kod: Tümünü seç

  
  Dm.ConSql.CommandTimeout:=9999;
  Dm.ConPrg.CommandTimeout:=9999;

  Dm.ConSql.ConnectionTimeout:=30;


ini dosyasından bağlantı için gerekli yukardaki metini okuyp connection stringe atıyorum. sonrasında ise command time out a deger atıyorum. ama sorgum 20 sn bile sürmeden time out diyor.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: sorgu zaman aşımına uğradı..

Mesaj gönderen thelvaci »

Merhaba, sizin için aşağıdaki gibi bir test yaptım. Sonuçları paylaşıyorum;

SQL Server'da kullandığım procedure aşağıdaki gibidir:

Kod: Tümünü seç

CREATE PROCEDURE sp_Wait
AS
	WAITFOR DELAY '00:00:40:00'
	SELECT CONVERT(VARCHAR(200), NEWID()) AS RetVal
Gözlemleyeceğiniz gibi stored procedure 40 saniye bekleyip ardından bir SELECT sorgusu çalıştırıyor. Delphi tarafında ise TADOConnection sınıfının CommandTimeOut propertysine 50 saniye yazıp bir TADOStoredProcedure üzerinden ilgili stored procedure Open edildiğinde, timeout hatası ile karşılaşırsınız. Ancak, TADOConnection sınıfının Execute metodu ile aynı stored procedure'yi çalıştırırsanız bir hata almazsınız. Bu durumda; TADOConnection sınıfının CommandTimeOut property'sine yazılan değerlerin sadece TADOConnection içinde kullanılan Command'ler için kullanıldığı hükmüne varabilirsiniz.

Bunun yanında TADOStoredProc sınıfının CommandTimeOut property'sine 50 saniye yazarsanız; TADOStoredProc'un da herhangi bir TimeOut ile karşılaşmadığını gözlemleyebilirsiniz. Delphi'nin eski sürümlerinde TADOStoredProc'un CommandTimeOut property'sinin protected olarak tanımlandığını hatırlıyorum eğer yanlış hatırlamıyorsam. Eğer sizde bu eski sürümlerden birisini kullanıyorsanız, bir hack sınıfı ile erişim sağlayıp CommandTimeOut property'sini güncellemelisiniz.

Örneğin;

Kod: Tümünü seç

type
  THackSP = class(TADOStoredProc);

..
begin
  THackSP(ADOStoredProc1).CommandTimeOut := 50;
  ADOStoredProc1.Open;
  ..
  ..
end;
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: sorgu zaman aşımına uğradı..

Mesaj gönderen ikutluay »

Yabancı bir sitede anlatılana göre Adoconnection'un commandtimeout değerinin bir işlevi yokmuş. o yüzden kullanacağınız queryinin bu değerine değer atamak gerekiyormuş. bir haftamız gitti ama sonunda da çareyi bulduk.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: sorgu zaman aşımına uğradı..

Mesaj gönderen thelvaci »

Yabancı site yanlış yazmış. Benim sizin için yaptığım testi bir de siz denerseniz bir işlevi olduğunu gözlemleyebilirsiniz.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: sorgu zaman aşımına uğradı..

Mesaj gönderen SimaWB »

thelvaci yazdı:Yabancı site yanlış yazmış. Benim sizin için yaptığım testi bir de siz denerseniz bir işlevi olduğunu gözlemleyebilirsiniz.
+1
There's no place like 127.0.0.1
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: sorgu zaman aşımına uğradı..

Mesaj gönderen ikutluay »

Valla üstad ; şüphesiz sende yazarken bir bildiğin vardır elbette ama ben ne yaptıysam commantimeout 30 sn ile sınırlı kalıyordu. bahsettiğiniz executesql ile de denedim open yerine yine kar etmedi. ama bahsettiğim yolla da çalıştı. benim zaten programdaki datasetlerde bir tek o datasette yüksek zamana ihtiyacım var. ama genede önerini arşive kaydedeceğim. fazla bilgi göz çıkarmaz.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: sorgu zaman aşımına uğradı..

Mesaj gönderen thelvaci »

Kod: Tümünü seç

CREATE PROCEDURE sp_Wait
AS
   WAITFOR DELAY '00:00:40:00'
   SELECT CONVERT(VARCHAR(200), NEWID()) AS RetVal
Stored procedure SQL Server'da yukarıdaki gibi tanımlı iken Delphi'de;

Kod: Tümünü seç

var
  asp : TADOStoredProc;
begin
  conn.CommandTimeOut := 50;
  conn.Open;

  asp := TADOStoredProc.Create(nil);
  try
    asp.ProcedureName := 'sp_Wait';
    asp.Open;
  finally
    asp.Free;
    conn.Close;
  end;
end;
biçiminde bir kullanımda TADOStoredProc üzerinden çalıştırmada Time Out alırsınız. Ancak;

Kod: Tümünü seç

begin
  conn.CommandTimeOut := 50;
  conn.Open;

  try
    conn.Execute('sp_Wait', dummy);
  finally
    conn.Close;
  end;
end;
biçimindeki bir çağrımda ise Time Out almazsınız. Bu sebep ile TADOConnection'ın CommandTimeOut property'sine değer atanmasının TADOConnection içindeki Command nesnelerini etkilediğini ifade etmiştim. Aşağıdaki gibi bir kullanım ise tam da istediğiniz işi yapar;

Kod: Tümünü seç

var
  asp : TADOStoredProc;
begin
  conn.Open;

  asp := TADOStoredProc.Create(nil);
  try
    asp.ProcedureName := 'sp_Wait';
    asp.CommandTimeOut := 50;
    asp.Open;
  finally
    asp.Free;
    conn.Close;
  end;
end;
Kodları Delphi olmadan yazdım, yazım hatası varsa affola.
Cevapla