Параметр SqlParameter против массива объекта

#asp.net-mvc #stored-procedures

#asp.net-mvc #хранимые процедуры

Вопрос:

У меня есть хранимая процедура, которая имеет много параметров, и я использую следующее для возврата результатов:

 db.Database.SqlQuery<GetListCamera_Result>("Camera.sp_get_list_camera @room_name, @disk_status, 
    @signal_loss_reason, @department_id , @sortColumnName, @sortDirection, @start, @length",
                    new SqlParameter("room_name", room_name),
                    new SqlParameter("disk_status", disk_status),
                    new SqlParameter("department_id", department),
                    new SqlParameter("signal_loss_reason", reason),
                    new SqlParameter("sortColumnName", sortColumnName),
                    new SqlParameter("sortDirection", sortDirection),
                    new SqlParameter("start", start),
                    new SqlParameter("length", length)).ToList();
 

Я видел, как один из моих старших использовал их намного чище, чем мой:

 db.Database.SqlQuery<GetLiquidbooks_Result>("sp_get_liquidbooks {0}, {1}, {2}, {3}, {4}",
    new object[] { LiquidCode, LibID, LocPrefix, LocID, UserID }).ToList();
 

В чем различия и есть ли что-нибудь, о чем мне нужно знать, если я переключаюсь на его

Ответ №1:

Я думаю, что ваш способ намного безопаснее. Однако, если вы хотите упростить задачу, вы можете обратиться к этой статье, вам не нужно инициализировать SqlParameter экземпляр, но @p1 @p2 синтаксис по-прежнему важен. В первом разделе статьи также упоминается, что следует соблюдать осторожность.

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

Что касается второго примера, рассмотрите возможность использования ObjectContext.ExecuteStoreQuery<T>() , он позволяет передавать строку запроса с {0} {1} синтаксисом и массивом объектов в качестве параметра в метод. Этот метод фактически вызывает CreateStoreCommand , который преобразует ваш запрос и объекты в параметризованный запрос. Но SqlQuery, похоже, нет.


К вашему СВЕДЕНИЮ:

  • Исходный код ExecuteStoreQuery — вы можете взглянуть на этот метод, чтобы понять, как он работает.
  • Исходный код SqlQuery — Как уже упоминалось, я перепроверил исходный код и не смог найти никаких кодов, которые помогли бы превратить его в параметризованный SQL