2010-06-20 17 views
10

Bu, C# SQL kullanarak bir deyim kullanarak mümkün mü?C# using deyimi, SQL ve SqlConnection

private static void CreateCommand(string queryString, 
    string connectionString) 
{ 
    using (SqlConnection connection = new SqlConnection(
       connectionString)) 
    { 
     SqlCommand command = new SqlCommand(queryString, connection); 
     command.Connection.Open(); 
     command.ExecuteNonQuery(); 
    } 
} 

Bağlantı açılırken bir hata olursa ne olur?

kullanarak deyim denemek ve nihayet
Hile yok

yüzden yakalamak hatası açılış bağlantıyı yakalayacak kullanarak parantez dışında yakalarlarsa?

Değilse, nasıl yukarıda gösterilen bir using deyimini kullanarak bunu uygulamak için?

+0

TIAS (.........) – zerkms

cevap

13

O C# bunu (Ben de bu kod tam olarak MSDN http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx gösterilmiştir bakınız) mümkündür. Eğer savunma ve bir üretim ortamında sorun giderme yardımcı olacağını potansiyel istisnalar giriş örneğin olması gerekiyorsa Ancak, bu yaklaşımı alabilir:

private static void CreateCommand(string queryString, 
string connectionString) 
{ 
    using (SqlConnection connection = new SqlConnection(
      connectionString)) 
    { 
     try 
     { 
      SqlCommand command = new SqlCommand(queryString, connection); 
      command.Connection.Open(); 
      command.ExecuteNonQuery(); 
     } 
     catch (InvalidOperationException) 
     { 
      //log and/or rethrow or ignore 
     } 
     catch (SqlException) 
     { 
      //log and/or rethrow or ignore 
     } 
     catch (ArgumentException) 
     { 
      //log and/or rethrow or ignore 
     } 
    } 
} 
+0

TEŞEKKÜR EDERİZ ve evet, msdn koduna evet, öğreniyorum ... – user287745

5

Herhangi bir hata yakalamak istiyorsanız, try - catch satırındaki herşeyi sarmanız gerekecektir. using blokları, yönetilmeyen kaynakların elden çıkarıldığından emin olurlar, istisnaları işleyemezler. Ayrıca, SqlCommand, SqlCommand, SqlCommand uygular, bu nedenle using bloğuna koymanızı öneririm.

1

Evet, bir try bloğunda using blok koyabilirsiniz ve aşağıdaki catchtry bloğa ilişkin hataları yakalayacak.

2

Hemen explicitely dışarı yazma:

SqlConnection connection = new SqlConnection(connectionString); 
try 
{ 
    using (SqlCommand command = new SqlCommand(queryString, connection)) 
    { 
     command.Connection.Open(); 
     command.ExecuteNonQuery(); 
    } 
} 
catch (Exception e) 
{ 
    // ...handle, rethrow. Also, you might want to catch 
    // more specific exceptions... 
} 
finally 
{ 
    connection.Close(); 
} 
+0

Nasıl değil? SqlConnection öğesini bir kullanarak kullanma bloğu çağrıyı sonlandırır. –

+0

bazı mantıksal problemler doğru mu? Bir yakalama sonra ince yakalamak ele alınır ve sonunda çalışır. ama ya hata olmazsa? Açılan iş bağlantısı-kullanarak bağlantıyı örtülü olarak kapatır ve son olarak da kapalı bağlantıyı kapatmaya çalışır! HATA ..... SAĞ Mİ? – user287745

+0

Hayır. Her iki durumda ("kullanarak" kullanarak, ve açıkça yazarak) sonunda blok çağrılacak. SqlConnection.Close() çağrılıyor. –

0

alanlar için veritabanına benzersiz bir dizin ekleyin ve hatayı yakalamak .

Her satır için SQL Bağlantısını yeniden etkinleştirmeyin. Bir bağlantıyı açmak ve kapatmak yoğun kaynaklıdır. Bunun gibi bir şey deneyin:

protected void btn_insert_Click(object sender, EventArgs e) 
{ 
    string connStr = "your connection string"; 
    SqlCommand cmd; 

    using (SqlConnection con = new SqlConnection(connStr)) 
    { 
     con.Open(); 
     foreach (GridViewRow g1 in GridView1.Rows) 
     { 
      try 
      { 
       cmd = new SqlCommand("command text", con); 
       cmd.ExecuteNonQuery(); 
      } 
      catch (SqlException sqlEx) 
      { 
       //Ignore the relevant Sql exception for violating a sql unique index 
      } 
     } 
    } 
}