none
chiusura connessione db sql server RRS feed

  • Domanda

  • Buongiorno, andavo in cerca di un consiglio riguardo la gestione della connessione a sql per la precisione in chiusura, in questa porzione di codice:

     private void startAttivita(Control att)   //funzione per salvare i parametri delle attività iniziate
            {
                string comando = "UPDATE Attivita SET data_inizio = @data_inizio, stato_esecuzione = @stat_esec Where nome_comm = @nome_comm and nome_attivita = @nome_attivita";
    
                using (SqlConnection conn = new SqlConnection(connStr))
                {
                    using (SqlCommand comm = new SqlCommand())
                    {
    
                        comm.Connection = conn;
                        comm.CommandText = comando;
    
                        comm.Parameters.AddWithValue("@nome_com", treeView1.SelectedNode.Text.ToString());
                        comm.Parameters.AddWithValue("@data_inizio", DateTime.Now);
                        comm.Parameters.AddWithValue("@nome_attivita", att.Name);
                        comm.Parameters.AddWithValue("@stat_esec", 1);
    
                        try
                        {
                            conn.Open();
                            comm.ExecuteNonQuery();
                        }
    
                        catch (SqlException errore)
                        {
                            MessageBox.Show(errore.ToString());   // eccezione per errore inserimento
                        }
    
                        finally
                        {
                            conn.Close();
                        }
    
                    }
                }
            }
     

    a livello di eccezione, è consigliabile inserire un conn.close() anche li qualora si possa verificare appunto una exeption? o la connessione viene rilasciata comunque con il finally?

    grazie


    • Modificato Morpheus88r lunedì 29 febbraio 2016 12:53
    lunedì 29 febbraio 2016 12:39

Risposte

Tutte le risposte

  • Ciao,

    visto che giustamente hai messo la connessione in un blocco using, quando uscirai da esso verrà in automatico chiusa e l'oggetto distrutto, quindi non hai necessità di fare la chiusura da nessuna parte

    ciao

    lunedì 29 febbraio 2016 12:57
  • Grazie Alessio, quindi potrei anche toglierla dal blocco finally? 

    in quest altro caso invece?

    private void caricaDescrizioni(string com) //metodo per caricare le descrizioni

    { Cursor.Current = Cursors.WaitCursor; SqlConnection sqlConnection = null; SqlCommand sqlCommand = null; SqlDataReader sqlReader = null; try { string strQuery = "SELECT ..."; sqlConnection = new SqlConnection(connStr); sqlConnection.Open(); sqlCommand = new SqlCommand(strQuery, sqlConnection); sqlReader = sqlCommand.ExecuteReader(); int i = 0; while (sqlReader.Read()) { object[] t = { sqlReader[0], sqlReader[1], sqlReader[2] }; campoD.Text = turni[0].ToString(); campoC.Text = turni[1].ToString(); campoLuogo.Text = t[2].ToString(); i++; } } catch (Exception exc) { MessageBox.Show(exc.Message, "Errore", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { Cursor.Current = Cursors.Default; sqlConnection.Close(); if (sqlReader != null) { sqlReader.Dispose(); sqlReader = null; } if (sqlCommand != null) { sqlCommand.Dispose(); sqlCommand = null; } } }

    il dispose chiude tutto anche in caso di eccezioni?


    • Modificato Morpheus88r lunedì 29 febbraio 2016 13:20
    lunedì 29 febbraio 2016 13:19
  • Si puoi toglierlo.

    il dispose chiude tutto ma devi chiudere in ordine inverso a come li apri,quindi la connection per ultima

    lunedì 29 febbraio 2016 13:24
  •  finally
                {
                   
                    
                    if (sqlReader != null)
                    {
                        sqlReader.Dispose();
                        sqlReader = null;
                    }
                    if (sqlCommand != null)
                    {
                        sqlCommand.Dispose();
                        sqlCommand = null;
                    }  
                    Cursor.Current = Cursors.Default;
                    sqlConnection.Close();              
                }           
    quindi così sono sicuro che anche se dovessero verificarsi eccezioni la connessione viene rilasciata correttamente?
    • Modificato Morpheus88r lunedì 29 febbraio 2016 13:30
    lunedì 29 febbraio 2016 13:30
  • Si, anche se è consigliato l'using che gestisce tutto in automatico
    • Contrassegnato come risposta Morpheus88r lunedì 29 febbraio 2016 13:33
    lunedì 29 febbraio 2016 13:32
  • ok, grazie mille!
    lunedì 29 febbraio 2016 13:32