2016-12-04 3 views
2

У меня есть часть кода, показанная ниже, где я открываю соединение и выполняю команду на нем. Должен ли я закрыть это соединение или как лучше всего написать этот фрагмент кода?Мне нужно закрыть соединение при использовании параметризованного соединения

SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ToString()); 

if (con.State == ConnectionState.Closed) 
{ 
    con.Open(); 
} 

string sql = "INSERT INTO RegisterUser(Name,LastName,email,Nationality,Country) VALUES (@param1,@param2,@param3,@param4,@param5)"; 

SqlCommand cmd = new SqlCommand(sql, con); 

cmd.Parameters.Add("@param1", SqlDbType.NVarChar, 200).Value = txtName.Text; 
cmd.Parameters.Add("@param2", SqlDbType.NVarChar, 100).Value = txtLastName.Text; 
cmd.Parameters.Add("@param3", SqlDbType.NVarChar, 50).Value = txtEmail.Text; 
cmd.Parameters.Add("@param4", SqlDbType.NVarChar, 50).Value = ddCountry.SelectedItem.Value.ToString(); 
cmd.Parameters.Add("@param5", SqlDbType.NVarChar, 50).Value = txtCountryCode.Text; 

cmd.CommandType = CommandType.Text; 
cmd.ExecuteNonQuery(); 

Будет ли вышеуказанный код не выпускать память в случае, если соединение необходимо закрыть?

+1

да, или вы могли бы использовать, используя заявление - см [ссылка] (https://msdn.microsoft.com/en-us/ библиотека/dw70f090 (v = vs.110) .aspx) и [link] (http://stackoverflow.com/questions/4389506/ado-net-closing-connection-when-using-using-statement) – phooey

+0

Итак, теперь 4 человека дают вам тот же самый ответ. Если вы получите 3 ответа и 1 комментарий в течение 2 минут с тем же самым ответом, возможно, вы вообще не искали, прежде чем задавать этот вопрос? –

+0

Как в стороне, вы, вероятно, хотели сказать «параметризованный запрос», а не «параметризованное соединение». – stakx

ответ

2

Да вам нужно всегда закрывать соединение. Также вам не нужен первый, если.

using(SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ToString())) 
{ 

    con.Open(); 

    string sql = "INSERT INTO RegisterUser(Name,LastName,email,Nationality,Country) VALUES (@param1,@param2,@param3,@param4,@param5)"; 

    SqlCommand cmd = new SqlCommand(sql, con); 
    cmd.Parameters.Add("@param1", SqlDbType.NVarChar, 200).Value = txtName.Text; 
    cmd.Parameters.Add("@param2", SqlDbType.NVarChar, 100).Value = txtLastName.Text; 
    cmd.Parameters.Add("@param3", SqlDbType.NVarChar, 50).Value = txtEmail.Text; 
    cmd.Parameters.Add("@param4", SqlDbType.NVarChar, 50).Value = ddCountry.SelectedItem.Value.ToString(); 
    cmd.Parameters.Add("@param5", SqlDbType.NVarChar, 50).Value = txtCountryCode.Text; 

    cmd.CommandType = CommandType.Text; 
    cmd.ExecuteNonQuery(); 
} 

Так using автоматически закроет соединение для вас. Это произойдет, даже если ваш код генерирует исключение. using представляет собой блок try/catch/finally. Таким образом, вы гарантируете, что соединение будет возвращено к Connection Pool, если произойдет ошибка.

try 
{ 
    Sqlconnection conn = new SqlConnection("your conn string"); 
} 
catch(Exception ex) 
{ 
    throw; 
} 
finally 
{ 
    conn.Close(); 
} 
+0

Does .net автоматически освобождает ресурсы, если они не выпущены, как в моем примере. Я имею в виду после некоторого времени – Learning

+1

Вообще-то да, но вы не знаете, когда это произойдет. Кроме того, это может не произойти, например. в случае убийства процесса. –

+0

Как проверить, успешно ли выполнен запрос – Learning

1

Вы должны закрыть его или иначе базовые ресурсы будут использоваться до завершения финализатора.

Самый лучший вариант на самом деле избавиться соединение (которое равно его закрытия в конкретном случае подключения объекта базы данных):

using (SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ToString())) 
{ 
    con.Open(); 

    string sql = "INSERT INTO RegisterUser(Name,LastName,email,Nationality,Country) VALUES (@param1,@param2,@param3,@param4,@param5)"; 

    SqlCommand cmd = new SqlCommand(sql, con); 
    cmd.Parameters.Add("@param1", SqlDbType.NVarChar, 200).Value = txtName.Text; 
    cmd.Parameters.Add("@param2", SqlDbType.NVarChar, 100).Value = txtLastName.Text; 
    cmd.Parameters.Add("@param3", SqlDbType.NVarChar, 50).Value = txtEmail.Text; 
    cmd.Parameters.Add("@param4", SqlDbType.NVarChar, 50).Value = ddCountry.SelectedItem.Value.ToString(); 
    cmd.Parameters.Add("@param5", SqlDbType.NVarChar, 50).Value = txtCountryCode.Text; 

    cmd.CommandType = CommandType.Text; 
    cmd.ExecuteNonQuery(); 
} 
+0

Что делать, если я не использую try catch ..finali .. block – Learning

+0

Объект будет удален, когда он покинет блок 'using'. Если 'использование' находится внутри блока' try', и возникает исключение, соединение будет удалено * до того, как * выполнение переместится в 'catch' /' finally'. –

0

Вы можете использовать 'с помощью'

using(SqlConnection(System.Configuration.ConfigurationManager 
          .ConnectionStrings["ConnectionString"].ToString())){ 
    if (con.State == ConnectionState.Closed) 
    { 
     con.Open(); 
    } 


    string sql = "INSERT INTO RegisterUser(Name,LastName,email,Nationality,Country) VALUES (@param1,@param2,@param3,@param4,@param5)"; 

    SqlCommand cmd = new SqlCommand(sql, con); 
    cmd.Parameters.Add("@param1", SqlDbType.NVarChar, 200).Value = txtName.Text; 
    cmd.Parameters.Add("@param2", SqlDbType.NVarChar, 100).Value = txtLastName.Text; 
    cmd.Parameters.Add("@param3", SqlDbType.NVarChar, 50).Value = txtEmail.Text; 
    cmd.Parameters.Add("@param4", SqlDbType.NVarChar, 50).Value = ddCountry.SelectedItem.Value.ToString(); 
    cmd.Parameters.Add("@param5", SqlDbType.NVarChar, 50).Value = txtCountryCode.Text; 

    cmd.CommandType = CommandType.Text; 
    cmd.ExecuteNonQuery(); 
}