Устаревшая система: есть ли какая-либо утечка соединения с базой данных с этим кодом? - PullRequest
0 голосов
/ 04 июля 2018

У нас есть эта устаревшая система, которая использует библиотеку Microsoft.Practices.EnterpriseLibrary от Microsoft:

Один метод выглядит так:

  try
    {   
        IDataReader dr = DB.ExecuteReader(storedProcedureName, param1, param2);

        try
        {
            dr.Read();
        }
        catch (Exception e)
        {
        }
        finally 
        {
            try
            {
                dr.Close();
            }
            catch (Exception)
            {
            }
        }              
    }          
    catch (Exception ex2)
    {
    }           

Библиотека документации: https://docs.microsoft.com/en-us/previous-versions/msp-n-p/bb748704(v=pandp.50)

заявляет "Выполняет команду и возвращает IDataReader, через который можно прочитать результат. Ответственный за вызов должен закрыть считыватель после завершения ."

в строке:

IDataReader dr = DB.ExecuteReader(storedProcedureName, param1, param2);

были включены во второй попытке? а с первой попытки удалиться? Может ли это вызвать некоторые утечки? Почему?

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Вместо использования IDataReader вы можете рассмотреть возможность использования IDbCommand, чтобы сделать его более безопасным и гибким.

 private static void ExecuteCommand(IDbConnection conn)
    {
        using (IDbCommand cmd = conn.CreateCommand())
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "ProcedureName";
            IDataParameter param = cmd.CreateParameter();
            param.ParameterName = "@parameterName";
            param.Value = "parameter value";
            cmd.Parameters.Add(param);
            using (IDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    // get data from the reader
                }
            }
        }
    }

ИЛИ , даже если вы предпочитаете использовать IDataReader с EnterpriseLibrary, всегда учитывайте оператор using, который делает код намного более безопасным и менее уязвимым.

            try
            {
                using (IDataReader dr = db.ExecuteReader(cmd))
                {
                    while (dr.Read())
                    {
                        // do something with the data
                    }
                }
            }
            catch (Exception e)
            {
                // exception handling
            }

Надеюсь, это поможет. :)

0 голосов
/ 04 июля 2018

Ваш код не имеет утечек

Но в соответствии с этим официальным Документы Microsoft

SqlDataReader.Close()

Не выдает никаких исключений, поэтому вы можете избавиться от внутренней попытки уловки, как это

try
{   
    IDataReader dr = DB.ExecuteReader(storedProcedureName, param1, param2);

    try
    {
        dr.Read();
    }
    catch (Exception e)
    {
    }
    finally 
    {
        dr.Close();
    }              
}          
catch (Exception ex2)
{
}

Но эффективный способ сделать это - использовать Используя вот так

try
{
    using(var dr = DB.ExecuteReader(storedProcedureName, param1, param2))
    {
        dr.Read(); 
    }
}
catch(Exception ex)
{
}
0 голосов
/ 04 июля 2018

Несмотря на громоздкость, этот код не должен создавать утечек памяти из устройства чтения данных.

Однако, это может быть написано намного проще и короче, как это:

try
{
    using(var dr = DB.ExecuteReader(storedProcedureName, param1, param2))
    {
        dr.Read(); 
        // It should be probably be while(dr.Read()) { /* do something with the data */ }
    }
}
catch(Exception ex)
{
// Do something with the exception!
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...