2012-03-15 13 views
5

Ben bir SQL deyimi çalıştırır aşağıdaki kod bit:SQL hata tespit edemez

int rowsEffected = 0; 
using (SqlConnection dbConnection = new SqlConnection(dbConnectionString)) 
{ 
    try 
    { 
     dbConnection.InfoMessage += new SqlInfoMessageEventHandler(dbConnection_InfoMessage); 
     dbConnection.FireInfoMessageEventOnUserErrors = true; 

     dbConnection.Open(); 


     SqlCommand command = dbConnection.CreateCommand(); 
     command.CommandTimeout = 0; 
     command.CommandText = sqlStatement; 

     rowsEffected = command.ExecuteNonQuery(); 
    } 
    catch (Exception e) 
    { 
     // Handle exception 
    } 
} 

Uzun koşu SQL ifadeleri ile RAISERROR kullanarak bir hata yükselterek SqlInfoMessageEventHandler yoluyla ilerleme bildirebilirsiniz uygun şiddet değeri.

FireInfoMessageEventOnUserErrors değerini true olarak ayarlama nedenleri, bu olmadan, SQL deyimindeki tüm iletiler yalnızca ExecuteNonQuery() döndürdüğünde bir kerede işlenir. Bu değer true değerine ayarlandığında, ilerleme mesajları SQL ifadesi tarafından yükseltildikçe işlenir.

Mülkün adı önerdiği gibi, olay işleyicisi, yalnızca SQL deyiminin ilerleme geri bildirimi için ayrılan belirli önem düzeyindeki hatalara dayandırmaz. Gördüğünüz gibi bir hata 'e' ama durum atma şey yapmaz içinde özelliğiyle meydana geldiğinde

public void dbConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e) 
{ 
    if (e.Errors.Count > 0) 
    { 
     throw new Exception("Something bad happened"); 
    } 

    // Report progress 
} 

, ben algılayabilir:

ilerleme geribildirim için olay işleyicisi şöyle . İnişin yakalama bloğuna düşmesini umuyordum ama bu durum böyle değil.

Bir hata oluştuğunu ExcecuteNonQuery() yönteminden sonra nasıl belirleyebilirim?

TIA

+0

Kodunuzu bir iş parçacığında çalıştırabilir ve bu işlevde thread.abort işlevini çağırabilirsiniz. – SamFisher83

+1

+1: Sadece okuduğum bir şeyi öğrendiğim soruları seviyorum. – NotMe

cevap

3

'un içine bir iş bulmayı başardım. Etkinlik işleyicisini içeren sınıfa bir özellik ekledim. Bir hata oluştuğunda, bu sınıftaki error flag özelliğini gönderdim ve ardından ExcecuteNonQuery() çağrısına göre okunabilir. Bir hata olsaydı, temizlik kodumu yapabilirim. Cevap için teşekkürler.

+0

Lütfen bu cevabı yanıt olarak işaretleyin – Marcin

+0

Benzer bir şey yapmak zorundaydım, ancak dış bir iş parçacığının DB Command nesnesine erişmesi gereken bir durumda, bu yüzden sonuncusu sakladım, böylece SQL çağrılarını engellemek potansiyel olarak kontrol edilebilir veya iptal edilebilir Başka bir konu. – Brain2000

1

Kullanım SqlException sınıf yerine Exception sınıfı. Ve sonra e.Errors

+0

Cevabınız için teşekkürler. Ben aslında Exception kullanmıyorum, özel bir İstisna kullanıyorum ama sadece örnek kod uğruna bunu istisna olarak değiştirdim. ExcecuteNonQuery() öğesini çağıran kodda e.Errors erişiminiz yok. – millie