#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