2013-12-13 3 views
1

Я пытаюсь построить SQL-запрос и передам строку в качестве параметра. Тем не менее, я получаю неправильную синтаксическую ошибку. Я распечатал ценности, и все, кажется, мне все равно.Неправильный синтаксис SQL CommandText

У меня есть строка "SqlString", который построен через ряд сцеплений, производя это:

sqlString = " and (event_id=60 OR event_id=61 OR event_id=56 OR event_id=73)" 

SqlCommand totalCmd = new SqlCommand(); 

totalCmd.CommandText = "SELECT sum(datediff(hour,[event_start],[event_end])) as Timeworked FROM event WHERE (event_start >= @StartDate and event_end <= @EndDate) @mySqlString"; 

totalCmd.Parameters.AddWithValue("StartDate", txtStartDate.Text); 
totalCmd.Parameters.AddWithValue("EndDate", txtEndDate.Text); 
totalCmd.Parameters.AddWithValue("mySqlString", sqlString); 

totalDT = SqlComm.SqlDataTable(totalCmd); 

Это вызывает ошибку

Неправильный синтаксис около '@mySqlString'

Я выполнил этот запрос непосредственно в SQL, введя параметры, и он работает нормально. В чем проблема с передачей параметра mySqlString?

+0

Вы пытаетесь ввести SQL. Параметры предотвращают внедрение SQL. –

ответ

3

В качестве параметра вы не можете добавить sqlString. Вы должны объединить его непосредственно к CommandText вместо:

totalCmd.CommandText = "SELECT sum(datediff(hour,[event_start],[event_end])) as Timeworked FROM event WHERE (event_start >= @StartDate and event_end <= @EndDate) " + sqlString; 

Весь смысл (помимо того, опрятный) добавления значений в Parameters вместо конкатенации должен очистить значения для вредоносных команд - т.е. параметры должны быть только чисто значения. Таким образом, как вы это делаете сейчас, sqlString интерпретируется как атака SQL injection и по существу будет очищен этой проверкой.

+0

Спасибо! Я этого не думал. Теперь работает. большое спасибо. – Cineno28

2

Вы должны поместить @ символ перед вашими параметрами, например:

totalCmd.Parameters.AddWithValue("@StartDate", txtStartDate.Text); 
totalCmd.Parameters.AddWithValue("@EndDate", txtEndDate.Text); 
totalCmd.Parameters.AddWithValue("@mySqlString", sqlString); 

Примечание: Синтаксис у вас не было найти матч, поэтому значение параметра не было замещено, таким образом, в запросе он прошел @mySqlString.

+0

Это не было проблемой здесь, но спасибо за ваше примечание. Я также включу это. – Cineno28

Смежные вопросы