Оператор using
уже предотвратит накопление соединений - он делает чистую сторону за вас, фактически являясь блоком try
/ finally
с вызовом Dispose
в блоке finally
,Если вы также хотите блок try
/ catch
, вы можете поместить его либо внутри, либо снаружи - но вы уверены, что он не должен быть на более высоком уровне?Как вы на самом деле ожидаете обработать исключение?
Кроме того, неясно, почему вы удаляете параметры из команды, когда команда все равно собирается быть удаленной ...
Я бы посоветовал вам также объявлять переменные внутри операторов using
, чтобы вы не пытались читать их вне блока:
using (SqlConnection connSQL = new SqlConnection(strConn)) {
InВ общем, предпочитайте, чтобы ваши переменные были настолько узкими, насколько это возможно.О, и ваш SqlDataReader
должен быть в выражении using
тоже.В любом случае это может не иметь значения, поскольку вы закрываете соединение и команду, но я бы сделал это из принципа: он реализует IDisposable
, поэтому вы должны его утилизировать.
О, и ваш путьитерации по sqlParameters
довольно длинны в данный момент.foreach
делает это проще, и даже если бы он не использовал for (int i = 0; i < sqlParameters.Length; i++)
, если бы у меня не было оснований полагать, что это не "простой" массив.
Итак, мой эквивалентный код выглядел быкак то так:
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand(strPreparedStatement, connection))
{
if (sqlParameters != null)
{
// If sqlParameter is an array, you can just use
// command.Parameters.AddRange(sqlParameters) instead
foreach (SqlParameter parameter in sqlParameters)
{
command.Parameters.Add(parameter);
}
}
using (SqlDataReader reader = command.ExecuteReader())
{
DataTable table = new DataTable();
// Perform any extra initialization here
table.Load(reader);
return table;
}
}
}