2015-02-12 2 views
1

Я создаю функцию, где я проверяю, проверен ли день обслуживания в базе данных. В каждой колонке находится Maintenance + DayName (MaintenanceSunday, MaintenanceMonday и т. Д.).Поле имени поля в запросе dapper

Похоже, что в любое время, когда вы проходите мимо объекта, он хочет принять значение проверяемого и не «ввести» строку. Есть ли способ безопасно достичь этого (т. Е. Не String.Format («где {0} = ...», поле))? Я действительно не хочу открывать возможность SQL Injection здесь (хотя есть более ранняя проверка, чтобы увидеть, есть ли q.ToUpper() в списке «SUNDAY», «MONDAY» и т. Д., Поэтому я думаю, что есть гарантия)

Я попытался это, но бомба пытается сравнить «Maintenancesunday» истинные (бит):

string field = "Maintenance" + q; // q = "sunday" 
return conn.Query<Data>("SELECT * FROM Data WHERE @Field = @Value", new { Field = field, Value = true }).ToList(); 
+0

Ваш запрос выглядит не так, вы сравниваете значения параметров друг с другом, а не столбцы – Ric

+0

справедливая точка. Есть ли способ в Dapper безопасно передать имя столбца, где я пытаюсь использовать поле? – Robert

+0

Не так, ваш запрос должен выглядеть так: 'conn.Query (" SELECT * FROM Data WHERE Field = @Field AND Value = @Value ", новый {Field = field, Value = true})' например. Это параметризует ваш запрос и безопасно из sql-injection – Ric

ответ

2

Щеголеватые просто использует ADO.NET, который не поддерживает параметризованные имена столбцов. Думаю, вам нужно какое-то жесткое кодирование для этого.

+0

' Dapper-Extensions', похоже, способен создавать предикаты без использования жестко заданных имен столбцов – Ric

+0

@Ric да, но вам придется создавать свойства для каждого дня обслуживания вашего POCO. –

+0

Вы правы, я не вижу ничего встроенного, позволяющего это делать. Dapper-Extensions может допускать метод его выполнения, но я хочу минимизировать количество зависимостей там, где это возможно. В принципе, поскольку я ищу только один день, я сначала перевел чек, если строка в верхнем регистре не совпадает с днем ​​(в верхнем регистре) с гигантским комментарием удаления чека (настройка в порядке) открывает его для SQL Injection, возвращается и просто выполняет String.Format, чтобы его вставить. – Robert