• 18-08-2012, 17:20:47
    #1
    Merhaba,

    c# ile yazılmış bir programda her 300 ms de bir StoredProcedure çalıştırıyorum. Normalde bir sorun yoktu ama 2 gündür StoredProcedure timeout expired hatası veriyor. Nette araştırdım "cmdKaydet.CommandTimeout = 0;" kodu ile çözüldüğünü buldum ekledim değişen birşey olmadı :S

    Verdiği hata ise tam olarak şu;

    Alıntı
    Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
    Benim için StoredProcedure her 300 ms de bir sürekli olarak çalışması lazım nasıl çözebilirim bu sorunu ?
  • 18-08-2012, 20:47:37
    #2
    CommandTimeout u neden 0 vermişsin bu bekleyeceğin süre anlamında. o süreyi uzat serverdan cevap gelmesi için o kadar süre bekler ve cevap gelmezse timeout exception unu fırlatır.
    300 ms de yollayabilirsin ama serverdan o kadar hızlı cevap alabilir misin bilmem, bazen sıkıntı olabiliyor alırken ya da gönderirken. Bunları hesaba katarak program yazmayı dene
  • 18-08-2012, 21:50:56
    #3
    ertan2002 adlı üyeden alıntı: mesajı görüntüle
    CommandTimeout u neden 0 vermişsin bu bekleyeceğin süre anlamında. o süreyi uzat serverdan cevap gelmesi için o kadar süre bekler ve cevap gelmezse timeout exception unu fırlatır.
    300 ms de yollayabilirsin ama serverdan o kadar hızlı cevap alabilir misin bilmem, bazen sıkıntı olabiliyor alırken ya da gönderirken. Bunları hesaba katarak program yazmayı dene
    Okuduğum yede CommandTimeout'un 0 olması durumunda sorunun çözüleceği yazıyordu yalanmış meğerse

    CommandTimeout saniye cinsinden mi değer alıyor yoksa timer gibi ms mi ? Benim için 10 sn yeterli olur sanıyorum. Çünkü sql'in 10 sn içinde yapamayacağı bir işlem yoktur herhalde
  • 18-08-2012, 21:54:22
    #4
    bu durmlarda msdn e başvurmak lazım

    The time in seconds to wait for the command to execute. The default is 30 seconds.

    saniye olarak ayarlanıyor. zaten standart olarak 30 saniye imiş hiç bir değer vermezsen.. sanırm problem başka şeyden kaynaklanıyordur..

    http://msdn.microsoft.com/en-us/libr...ndtimeout.aspx

    bu da türkçesi

    http://msdn.microsoft.com/tr-tr/libr...ndtimeout.aspx

    edit: zamanla ilgili yok saymak için

    The CommandTimeout property will be ignored during asynchronous method calls such as BeginExecuteReader.

    bahsedilen metodu çağırmak gerekiyor.

    http://msdn.microsoft.com/en-us/libr...utereader.aspx
  • 18-08-2012, 22:04:58
    #5
    ertan2002 adlı üyeden alıntı: mesajı görüntüle
    bu durmlarda msdn e başvurmak lazım

    The time in seconds to wait for the command to execute. The default is 30 seconds.

    saniye olarak ayarlanıyor. zaten standart olarak 30 saniye imiş hiç bir değer vermezsen.. sanırm problem başka şeyden kaynaklanıyordur..

    http://msdn.microsoft.com/en-us/libr...ndtimeout.aspx

    bu da türkçesi

    http://msdn.microsoft.com/tr-tr/libr...ndtimeout.aspx

    edit: zamanla ilgili yok saymak için

    The CommandTimeout property will be ignored during asynchronous method calls such as BeginExecuteReader.

    bahsedilen metodu çağırmak gerekiyor.

    http://msdn.microsoft.com/en-us/libr...utereader.aspx
    30 sn gerçekten çok fazla bir süre. Bu kadar sürede cevap gelmemesi sizce neden olabilir ?

    Edit: o zaman SqlCommand'ı .ExecuteNonQuery() yerine .ExecuteReader() ile çalıştırsam bu sorunu yaşamam değil mi ?
  • 18-08-2012, 22:31:15
    #6
    kodlarını paylaşırsan daha iyi olur
  • 18-08-2012, 22:45:12
    #7
    ertan2002 adlı üyeden alıntı: mesajı görüntüle
    kodlarını paylaşırsan daha iyi olur
    SqlCommand cmdKaydet2 = new SqlCommand();
    cmdKaydet2.Connection = baglanti;
    cmdKaydet2.CommandType = CommandType.StoredProcedure;
    cmdKaydet2.CommandText = "sp_ekle";
    cmdKaydet2.Parameters.Add(new SqlParameter("Adi", dt.Rows[i]["Adi"]));
    cmdKaydet2.Parameters.Add(new SqlParameter("Soyadi", dt.Rows[i]["Soyadi"]));
    cmdKaydet2.Parameters.Add(new SqlParameter("Yasi", dt.Rows[i]["Yasi"]));
    cmdKaydet2.Parameters.Add(new SqlParameter("Adres", dt.Rows[i]["Adres"]));
    cmdKaydet2.Parameters.Add(new SqlParameter("Adres2", dt.Rows[i]["Adres2"]));
    cmdKaydet2.Parameters.Add(new SqlParameter("Tel", dt.Rows[i]["Tel"]));
    cmdKaydet2.Parameters.Add(new SqlParameter("Tel2", dt.Rows[i]["Tel2"]));
    cmdKaydet2.ExecuteNonQuery();
    cmdKaydet2.Dispose();
    Kullandığım bir kod bu mesala.
  • 18-08-2012, 23:08:55
    #8
    ExecuteNonQuery doğru kullanmışsın
    bi kaç tavsiyem olacak
    öncelikle dispose yapma bunun yerine

    using(SqlCommand cmdKaydet2 = new SqlCommand("sp_ekle",baglanti))
    {
    
    cmdKaydet2.CommandType = CommandType.StoredProcedure; 
    cmdKaydet2.Parameters.Add(new SqlParameter("Adi", dt.Rows[i]["Adi"])); 
    cmdKaydet2.Parameters.Add(new SqlParameter("Soyadi", dt.Rows[i]["Soyadi"])); 
    cmdKaydet2.Parameters.Add(new SqlParameter("Yasi", dt.Rows[i]["Yasi"])); 
    cmdKaydet2.Parameters.Add(new SqlParameter("Adres", dt.Rows[i]["Adres"])); 
    cmdKaydet2.Parameters.Add(new SqlParameter("Adres2", dt.Rows[i]["Adres2"])); 
    cmdKaydet2.Parameters.Add(new SqlParameter("Tel", dt.Rows[i]["Tel"])); 
    cmdKaydet2.Parameters.Add(new SqlParameter("Tel2", dt.Rows[i]["Tel2"])); 
    cmdKaydet2.ExecuteNonQuery(); 
    
    }
    bu şekilde dene..

    ayrıca entity framework kullanmanı tavsiye ederim
  • 18-08-2012, 23:39:39
    #9
    ertan2002 adlı üyeden alıntı: mesajı görüntüle
    ExecuteNonQuery doğru kullanmışsın
    bi kaç tavsiyem olacak
    öncelikle dispose yapma bunun yerine

    using(SqlCommand cmdKaydet2 = new SqlCommand("sp_ekle",baglanti))
    {
    
    cmdKaydet2.CommandType = CommandType.StoredProcedure; 
    cmdKaydet2.Parameters.Add(new SqlParameter("Adi", dt.Rows[i]["Adi"])); 
    cmdKaydet2.Parameters.Add(new SqlParameter("Soyadi", dt.Rows[i]["Soyadi"])); 
    cmdKaydet2.Parameters.Add(new SqlParameter("Yasi", dt.Rows[i]["Yasi"])); 
    cmdKaydet2.Parameters.Add(new SqlParameter("Adres", dt.Rows[i]["Adres"])); 
    cmdKaydet2.Parameters.Add(new SqlParameter("Adres2", dt.Rows[i]["Adres2"])); 
    cmdKaydet2.Parameters.Add(new SqlParameter("Tel", dt.Rows[i]["Tel"])); 
    cmdKaydet2.Parameters.Add(new SqlParameter("Tel2", dt.Rows[i]["Tel2"])); 
    cmdKaydet2.ExecuteNonQuery(); 
    
    }
    bu şekilde dene..

    ayrıca entity framework kullanmanı tavsiye ederim
    Dispose etmek kötü mü ? Bana bu şekilde öğrettiler çünkü. Birde bu kullanımın diğer kullanıma göre + ve - neler acaba bilgi verebilirmisiniz kısaca Sizede uğraştırıyorum ama kusua bakmayın.