2013-03-07 13 views
5

Son zamanlarda benim için ilginç davranışlar fark edildi. sahip olduğunda ExecuteScalar SELECT'ten hemen sonra döner mi?

MS SQL saklı-yordam SqlCommand.ExecuteScalar kullanılarak ran(), başvurum SEÇ sonra yapılır görünen herhangi bir SQL Hatalar veya baskılar tamamen habersiz gibi görünüyor.

En olası açıklama bu akış kontrolü (saklı yordam altında sessizce yürütülmesine devam gerçi) bitirmek için saklı yordam beklemeden herhangi SELECT sonuç görünür hemen sonra C# verilir olduğunu.

Apaçık Avantaj performans kazancı (sonuç zaten bilindiği için, beklemeye gerek) 'dir, maalesef C# uygulaması bu noktadan sonra olabilirdi herhangi bir SQL istisna habersizdir.

kimse benim açıklama onaylamak olabilir mi? Bu davranış değiştirilebiliyor mu?

+1

Bu sorunuza cevap olabilir: http://stackoverflow.com/questions/7024109/how-can-i-get-an-error-message-that-happens-when- -ExecuteNonQuery kullanarak ve bu da yararlı olabilir: Eğer akışın sonuna kadar sonucu geçmiş okumaz eğer http://support.microsoft.com/kb/321903/en-us –

+0

Bu DataReaders ile gerçekleşir. Bu, ExecuteScalar'a uygulanacaksa elden bile çıkma. –

cevap

1

ExecuteNonQuery yöntemi "ExecuteReader" diyoruz ve hemen iade okuyucu nesne üzerinde "Kapat" arayacak. ExecuteScalar bir kez "Oku" çağırır, ilk değeri (dizin 0) seçer ve sonra "Kapat" ı çağırır. DataReader esasen özel bir ağ akımına başka bir şey, bu (Close denir) geçerli konum afther döndürülen herhangi bir bilgi olduğundan

sadece sunucu kudreti gönderilen halde, fiili istemci bileşenlerini asla ulaşacak o. Uygulama, hiçbiri gerekmediğinde büyük miktarda veriyi geri döndürmekten kaçınmaktır. Senin durumunda

, bu sorunun iki çözümü görüyoruz.

  1. yerine ExecuteReader kullandığından emin olun ve sonucu tüm yolu okuyun: sunucu tarafı kontrol edebilirsen

    using(var reader = command.ExecuteReader()) 
    { 
        do 
        { 
          while (reader.Read()) { /* whatever */ }; 
        } while (reader.NextResult()); 
    } 
    
  2. , asıl "send- taşımak için yardımcı olacaktır istemciye "söz konusu prosedürün veya toplu işin sonuna kadar seçin. Şunun gibi:

    create proc Demo 
    as 
    declare @result int 
    select top 1 @result = Id from MyTable where Name = 'testing' 
    print 'selected result...' 
    select @result Id -- will send a column called "Id" with the previous value 
    go 
    
İlgili konular