безопасны ли статические методы в asp.net

#asp.net #function #shared

#asp.net #функция #общий

Вопрос:

привет, ребята, у меня есть веб-сайт, который содержит много работы с базой данных для отображения данных на странице, поэтому я создал общедоступный класс VB под App_Code.

Теперь у меня есть все методы и функции в этом классе, которые являются общими (статическими), также у меня есть переменная connection, которая также является статической.

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

Ответ №1:

Со статическим методом нет проблем с «безопасностью». Ваш коллега в замешательстве. Должен ли написанный вами код быть статическим или методами экземпляра, зависит от того, что именно он делает. Но использование их в качестве статических методов не является «опасным».

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

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

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

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

 public void DoSomething()
{
    //Doing some work that doesn't need a connection.

    //Now ready to submit or fetch data from the database.
    using (SqlConnection connection = new SqlConnection(...))
    {
        using (SqlCommand command = new SqlCommand(..., connection))
        {
            //Now, working with the connection and command.
        }
    }

    //Done with the connection, doing more work now.
}
  

Оператор using работает со всем, что есть IDisposable . Ваша connection переменная здесь будет автоматически закрыта и уничтожена в закрывающей скобке using инструкции. Я рекомендую вам использовать ее для всего, что вы можете. Stream s, SqlConnection s, Font s и т.д.

Комментарии:

1. Я хочу знать, следует ли делать объект connection статическим и вызывать его на другой странице через класс, подобный: custom.connection есть ли какие-либо проблемы с тем, чтобы сделать переменную connection статической.

Ответ №2:

Мне кажется, что у вас есть редко используемая инструкция SQL, которая ссылается на столбец, которого не существует в таблице.

Например, предположим, что у вас был SQL следующим образом

 SELECT Col4 FROM Table2
  

и Col4 не был членом Table2. Вы получите ошибку, которую вы описываете.

Если вы создаете SQL динамически (что сложно), вы можете столкнуться с этим.

Но я не думаю, что это имеет какое-либо отношение к безопасности вашего метода.’

Комментарии:

1. Согласен. @Abbas, тебе нужно перехватить и записать ошибку. Это может быть IF условием в sproc, о существовании которого вы забыли.