Использование вложенных с использованием в C # и SQL Server - PullRequest
2 голосов
/ 09 февраля 2010

Этот поток является продолжением Есть ли причина проверять наличие нуля внутри множественного числа, используя clausule в c #?

Я заметил, что resharper позволяет мне определять использование, не открывая открывающую / закрывающую скобку, как в методе ниже (но тогда я не смогу использовать определенные переменные позже, если скобок нет, кроме тех, которые используется точно ниже определенного с помощью):

public static string sqlGetDatabaseRows() {
        string varRows = "";
        const string preparedCommand = @"
                    SELECT SUM(row_count) AS 'Rows'
                    FROM sys.dm_db_partition_stats
                    WHERE index_id IN (0,1)
                    AND OBJECTPROPERTY([object_id], 'IsMsShipped') = 0;";
        using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetailsDZP))
        using (var sqlQuery = new SqlCommand(preparedCommand, varConnection))
        using (var sqlQueryResult = sqlQuery.ExecuteReader())
            if (sqlQueryResult != null) {
                while (sqlQueryResult.Read()) {
                    varRows = sqlQueryResult["Rows"].ToString();
                }
                sqlQueryResult.Close();
            }
        return varRows;
    }

Это хорошо? Или я должен использовать это так?

public static string sqlGetDatabaseRows() {
        string varRows = "";
        const string preparedCommand = @"
                    SELECT SUM(row_count) AS 'Rows'
                    FROM sys.dm_db_partition_stats
                    WHERE index_id IN (0,1)
                    AND OBJECTPROPERTY([object_id], 'IsMsShipped') = 0;";
        using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetailsDZP)) {
            using (var sqlQuery = new SqlCommand(preparedCommand, varConnection))
            using (var sqlQueryResult = sqlQuery.ExecuteReader())
                if (sqlQueryResult != null) {
                    while (sqlQueryResult.Read()) {
                        varRows = sqlQueryResult["Rows"].ToString();
                    }
                    sqlQueryResult.Close();
                }
            varConnection.Close();
        }
        return varRows;
    }

sqlConnectOneTime выглядит следующим образом:

    public static SqlConnection sqlConnectOneTime(string varSqlConnectionDetails) {
        SqlConnection sqlConnection = new SqlConnection(varSqlConnectionDetails);
        sqlConnect(sqlConnection);
        if (sqlConnection.State == ConnectionState.Open) {
            return sqlConnection;
        }
        return null;
    }

Мои вопросы:

  1. Должен ли я закрывать varConnection с помощью varConnection.Close () и sqlQueryResult.Close (); в конце? (но это приводит к использованию скобок), или соединение будет закрыто после завершения использования.

  2. Если я проверяю NULL на varConnection, поскольку возможно, что он вернет null (с другой стороны, resharper не жалуется).

  3. Есть ли какой-то лучший подход, который я мог бы использовать для определения sqlConnectOneTime? Например, когда соединение не открывается, оно должно вернуть ConnectionState.Closed вместо null?

Также, просто на заметку, я открываю новое соединение каждый раз, когда выполняю новый запрос / обновление / вставку, так как я использую многопоточность, и это была самая умная идея, которую я мог придумать в тот самый момент. Не стесняйтесь предложить лучший вариант: -)

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

MadBoy

Редактировать: измененный вопрос, если varConnection.Close () и sqlQueryResult.Close () не нужны, если используется use.

Ответы [ 2 ]

1 голос
/ 09 февраля 2010
  1. Close () вызывается методом Dispose (), поэтому, если вы правильно используете «using», вам не нужно явно вызывать Close ().
  2. Если возможно вернуть NULL, вам следует проверить это. Я бы посоветовал, что если вы управляете кодом, который получает соединение sql, вам настоятельно рекомендуется генерировать исключение, а не возвращать NULL. В противном случае другие разработчики могут столкнуться с такими же проблемами. Неспособность открыть соединение SQL, которое требуется, мне кажется допустимым исключительным случаем. При необходимости вы всегда можете включить TryConnectOneTime, когда разработчик хочет избежать обработки исключений.

Кроме того, еще одно примечание по стилю - я бы посоветовал правильно подготовить ваши операторы использования в случае, если добавляется лишняя дополнительная строка и возникает непредвиденная ошибка. Что касается стиля, я обычно не склонен использовать отступы, когда у меня есть несколько утверждений вместе, но это все зависит от личных предпочтений.

1 голос
/ 09 февраля 2010

Безопасно использовать его, как в первом примере. using закрывает объекты чтения, команды и подключения и даже проверяет значения null (поэтому вы не получите NullReferenceException, если varConnection равно null)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...