Priya-Kiko Ответов: 1

Необходима помощь по утилизации неуправляемых ресурсов с помощью "using"


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

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
        }
    }
}


В этом фрагменте означает ли это, что все неуправляемые ресурсы внутри блока using будут утилизированы, когда мы выйдем из блока ?

Заранее спасибо.

Что я уже пробовал:

Много читал в интернете о dispose, GC, а также размещал вопросы, чтобы прояснить мои сомнения здесь, в проекте code. Я все еще в дилемме по нескольким аспектам управления памятью.

0x01AA

Хороший и простой eaxample / объяснение: http://www.dotnetperls.com/sqlconnection[^]

Priya-Kiko

Огромное спасибо. Но тогда, даже для таблиц данных, используемых для загрузки данных, я думаю, что они должны быть заключены внутри using (), тогда как насчет их области действия ?

1 Ответов

Рейтинг:
9

lukeer

Нет. Просто SqlConnection connection будет утилизирован.
Учитывая Объект sqlconnection правильно, любые неуправляемые ресурсы, которые он занимает, будут доступны после закрывающей скобки. Но что-нибудь за пределами Объект sqlconnection тип-это ваше дело, чтобы заботиться о нем.


Priya-Kiko

Спасибо за ответ. Это означает, что "команда" должна быть command.dispose() позже ?

Michael_Davies

Вы можете иметь более одной переменной в using, добавление команды в using избавит вас от нее.
использование (sqlconnection connection = new SqlConnection(
connectionString),
Команда SqlCommand = new SqlCommand(queryString, connection))

Priya-Kiko

Спасибо за ваш ответ.

В такой ситуации, когда есть несколько операторов рядом со следующим, должен ли я использовать его таким образом и как насчет области действия таблиц данных. пожалуйста, помогите уточнить. Спасибо.

{
mconn.Открыть();
using (SqlCommand msqlcmd = new SqlCommand ("select * from bmast", mconn),
Класс sqldatareader msqldat = msqlcmd.Метода executereader(),
DataTable dtbmast = новый DataTable(),
dtbmast. Load(msqldat),
msqldat.Закрывать())

using (SqlCommand msqlcmd = new SqlCommand ("select * from kmast", mconn),
Класс sqldatareader msqldat = msqlcmd.Метода executereader(),
DataTable dtkmast = новый DataTable(),
dtkmast. Load(msqldat),
msqldat.Закрывать())
}


Michael_Davies

Не совсем уверен, что вы имеете в виду, однако зачем избавляться от объекта, когда вы можете повторно использовать его, и почему вы помещаете операторы выполнения в оператор using, очень трудно читать, легко ошибаться, если он работает.

Какой смысл загружать таблицу, которая затем утилизируется почти сразу же после завершения использования?

Если msqldat и msqlcmd были в одном операторе Using, вы можете повторно использовать их, экономя время, затраченное на утилизацию, а затем инициализировать другой экземпляр того же самого. Для читателя в их примерах MS просто закрывает читатель и не утилизирует его.

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.close(v=против 110). aspx

{
mconn.Открыть();
using (SqlCommand msqlcmd = new SqlCommand ("select * from bmast", mconn),
DataTable dtbmast = новый DataTable(),
DataTable dtkmast = новый DataTable())
{
Класс sqldatareader msqldat = msqlcmd.метода executereader();
dtbmast. Load(msqldat);
msqldat.Закрывать();

msqlcmd. commandtext = " select * from kmast";
msqldat = msqlcmd.Метода executereader();
dtkmast. Load(msqldat);
msqldat.Закрывать();
}
// Теперь объекты располагаются вместе с данными в таблицах данных...
mconn.рядом();
}

lukeer

Я не знал, что синтаксис запятой работает, и никогда не пробовал.
Спасибо.

Priya-Kiko

Спасибо,

Так может ли мой код быть таким :

DataTable dtbmast = новый DataTable(),
DataTable dtkmast = новый DataTable())
...
...
...
private void somefunction()
{
mconn.Открыть();
using (SqlCommand msqlcmd = new SqlCommand ("select * from bmast", mconn)
{
использование (SqlDataReader msqldat = msqlcmd.Метода executereader())
{
dtbmast. Load(msqldat);
msqldat.Закрывать();

msqlcmd. commandtext = " select * from kmast";
msqldat = msqlcmd.ExecuteReader (); / / здесь я получаю ошибку не могу назначить msqldat, потому что она находится в операторе using
dtkmast. Load(msqldat);
msqldat.Закрывать();
}
// Здесь msqldat удален
}
// Здесь msqlcmd удален
mconn.рядом();
}

// можно использовать dtkmast и dtbmast здесь

Правильно ли я понимаю это, и если это внутри, попробуйте поймать, как это работает. Пожалуйста помочь. Извините за беспокойство снова и снова.