2017-02-07 13 views
0

Я знаю, что для предотвращения внедрения SQL вы должны использовать такие параметры, как @param1 и @param2 - но как бы вы это достигли, когда вам нужно было передавать одни и те же параметры несколько раз?Запуск SQL-запроса с несколькими параметрами

Теперь параметры будут переданы из двух текстовых полей на winform. Но опять мой? как C# обрабатывает параметры обработки в 2 разных местоположениях в строке sql?

;WITH CTE AS 
(
     Select 
     RTRIM(LTRIM(employeename)) As employeename 
     ,psrti 
     ,nes 
     FROM helper1 
) 
Select 
[Employee Name] = RTRIM(LTRIM(cte.employeename)) 
,[days employed] = (Select COUNT([days]) 
          FROM [empinfo] jb 
          WHERE CAST([hiredate] As Date) BETWEEN @startdate AND @enddate 
          AND RTRIM(LTRIM(jb.employeename)) = RTRIM(LTRIM(cte.employeename))) 
,[terminated emps] = (Select Count(empID) from terminate where termination date between @startdate AND @enddate) 
FROM hrfile hr1 
RIGHT JOIN CTE cte 
ON hr1.employeename = cte.employeename 
GROUP BY RTRIM(LTRIM(cte.employeename)),RTRIM(LTRIM(hr1.employeename)),cte.nes 
ORDER BY RTRIM(LTRIM(cte.employeename)) ASC 

Я знаю, что только с 1-го набора Params я бы

string sql = "";; 

using (SqlConnection connection = new SqlConnection(/* connection info */)) 
using (SqlCommand command = new SqlCommand(sql, connection)) 
{ 
    var param1 = new SqlParameter("param1", SqlDbType.DateTime); 
    var param2 = new SqlParameter("param2", SqlDbType.DateTime); 
    param1.Value = txtOne.Text; 
    param2.Value = txtTwo.Text; 
    command.Parameters.Add(param1); 
    command.Parameters.Add(param2); 
    var results = command.ExecuteReader(); 
} 
+0

до тех пор, пока ваша строка SQL будет отформатирована правильно, она будет обрабатывать ваши параметры сколько угодно раз. Тем не менее я бы преобразовал в хранимую процедуру. – DaniDev

+0

@ DaniDev - будет ли хранимый процесс быстрее, чем прямой оператор sql? В моих тестовых примерах оператор прямой sql был быстрее. – BellHopByDayAmetuerCoderByNigh

+0

2 причины: 1. Хранимые процедуры намного легче отлаживать, если у вас есть несколько сложный запрос, как у вас. 2. безопаснее – DaniDev

ответ

0

Вы делаете то же самое (установите значение параметра только один раз), даже если параметры используются несколько раз. C#/ADO.NET позаботится о замене параметров назначенными значениями в нескольких местах.