Ответ 1
Как Dapper помогает защитить от инъекций SQL?
Это делает действительно, действительно простым в использовании полностью параметризованный доступ к данным, без необходимости связывать входные данные. В частности, поскольку вам не нужно перескакивать через множество "добавить параметр", установить тип параметра, проверить значение "null", поскольку ADO.NET имеет sucky null-handling, rinse/repeat для 20 параметров ", делая обработку параметров глупо удобно. Он также превращает ряды в объекты очень просто, избегая соблазна использовать DataTable
... все выигрывают.
Из комментариев:
Еще одно... что делает dapper на самом деле помогает?
Чтобы ответить, давайте возьмем пример из ответа marc_s и напишем его по-старому, считая, что все, с чего мы должны начать, - это connection
. Тогда:
List<Dog> dogs = new List<Dog>();
using(var cmd = connection.CreateCommand()) {
cmd.CommandText = "select Age = @Age, Id = @Id";
cmd.Parameters.AddWithValue("Age", DBNull.Value);
cmd.Parameters.AddWithValue("Id", guid);
using(var reader = cmd.ExecuteReader()) {
while(reader.Read()) {
int age = reader.ReadInt32("Age");
int id = reader.ReadInt32("Id");
dogs.Add(new Dog { Age = age, Id = id });
}
while(reader.NextResult()) {}
}
}
за исключением того, что я чрезмерно упрощен, так как он также затрагивает широкий спектр вопросов, таких как:
- нулевое обращение параметров
- Обработка имен столбцов результатов
- с использованием индексов порядковых столбцов
- адаптация к структурным изменениям таблицы и типа
- преобразование данных столбцов результатов (между различными примитивами, строками, перечислениями и т.д.)
- специальная обработка сценария oh-so-common "в этом списке"
- для "execute", специальная обработка "примените это отдельно к списку входов"
- избегая глупых опечаток
- сокращение обслуживания кода
- обработка нескольких сеток
- обработка нескольких объектов, возвращаемых по горизонтали в одной сетке
- работает с произвольными поставщиками ADO.NET(подсказка:
AddWithValue
редко существует)- включая определенную поддержку таких вещей, как Oracle, для которой требуется дополнительная настройка
- отлично работает с ADO.NET decoratos, такими как "мини-профайлер"
- встроенная поддержка как буферизированных (подходит для небольших и умеренных данных, минимизирует длительность команд), так и non-bufferesd (подходит для больших данных, минимизирует использование памяти).
- оптимизируется людьми, которые заботятся о производительности и знают "совсем немного" о доступе к данным и метапрограмме
- позволяет использовать ваш выбор POCO/DTO/anon-type/whatever для параметра и выхода
- позволяет использовать либо
dynamic
(для нескольких столбцов), либо примитивы и т.д. (для одного столбца), когда вывод не требует генерации POCO/DTO - избегать накладных расходов сложных полностью типизированных ORM, таких как EF
- избежать накладных расходов слабых типизированных слоев, например
DataTable
- открытие и закрытие соединений как необходимо
- и широкий спектр других распространенных ошибок