2015-04-22 6 views
1

В настоящее время я пытаюсь получить содержимое всех записей между определенной датой в базе данных MySQL с именем «заказы». Для этого я использую следующий код:Запрос C# не выполняется.

query = "SELECT id, date, contactinfo, orderinfo, contents, print_location, order_id, file_size FROM orders where date between " + dateFrom + " and " + dateTill + " and print_location like 'antw'"; 

dateFrom и dateTull - это переменные, содержащие временные метки.

Все выше работает отлично. Проблема, с которой я столкнулся сейчас, заключается в том, что я хочу проверить на двух print_locations вместо одного. Как показано в приведенном выше коде, я ищу только «antw». Код, который я прямо сейчас искать на два print_locations выглядит следующим образом:

query = "SELECT id, date, contactinfo, orderinfo, contents, print_location, order_id, file_size FROM orders where date between " + dateFrom + " and " + dateTill + " and print_location like 'antw' or print_location like 'helm'"; 

Но почему-то это не работает. Я не получаю ошибку, которую форма просто зависает и делает ее недоступной.

Это, вероятно, простая проблема для решения, но я не могу ее решить. Причина, по которой я показываю значение переменной запроса, а не остальную часть моего кода, - это то, что все работает отлично в течение нескольких недель.

+0

Не могли бы вы отобразить больше кода? –

+4

вы забыли скобки 'и (print_location как 'antw' или print_location, например 'helm')' – fubo

+0

Кроме того, используйте [подготовленные заявления] (http://en.wikipedia.org/wiki/Prepared_statement). Это доступно для потенциального [SQL-инъекции] (http://en.wikipedia.org/wiki/SQL_injection). – Phylogenesis

ответ

2

Вы забыли скобки и вы должны использовать параметры, чтобы избежать инъекций нападения

string Command = "SELECT id, date, contactinfo, orderinfo, contents, print_location, order_id, file_size FROM orders where date between @dateFrom and @dateTill and (print_location like 'antw' or print_location like 'helm')"; 
using (MySqlConnection myConnection = new MySqlConnection(ConnectionString)) 
{ 
    using (MySqlDataAdapter myDataAdapter = new MySqlDataAdapter(Command, myConnection)) 
    { 
     myDataAdapter.SelectCommand.Parameters.Add(new MySqlParameter("@dateFrom", yourDateFrom)); 
     myDataAdapter.SelectCommand.Parameters.Add(new MySqlParameter("@dateTill", yourdateTill)); 
     DataTable dtResult = new DataTable(); 
     myDataAdapter.Fill(dtResult); 
    } 
} 
+0

Спасибо, фубо! Я рассмотрю параметры, чтобы избежать инъекций. – Quartermain

+1

Возможно, вы также захотите добавить причину * почему * она не работает должным образом (правила приоритета оператора для 'или' и' и'). – Phylogenesis

1

Добавить скобки в вашей логике:

query = "SELECT id, date, contactinfo, orderinfo, contents, print_location, order_id, file_size FROM orders where date between " + dateFrom + " and " + dateTill + " and (print_location like 'antw' or print_location like 'helm')"; 

Будьте осторожны, хотя ... это пахнет как потенциальный случай SQL инъекции!

+0

Это действительно было проблемой. Благодарим вас и благодарим fubo за быстрый ответ. – Quartermain

1

Никогда не работал с MySQL, но, возможно, вы забыли %% в своих предложениях LIKE. Так оно и будет, оно будет работать как =.

SELECT id, date, contactinfo, orderinfo, contents, print_location, order_id, file_size FROM orders where date between " + dateFrom + " and " + dateTill + " and (print_location like '%antw%' or print_location like '%helm%') 
1

Вам нужны круглые скобки на свой второй наборе «ИЛИ» условия:

запрос = «SELECT ID, дату , contactinfo, orderinfo, contents, print_location, order_id, file_size От заказов, где дата между «+ dateFrom +» и «+ dateTill +» и (print_location, например, «antw» или print_location like «helm») »;

В противном случае ваше заявление звучит так:

Получить мне все эти вещи, где дата между этой датой и этой датой, и print_location как «Antw» ...

Или получить меня все эти вещи где print_location как «helm».

Поскольку вы используете подобное, это, вероятно, просто зависает во время выполнения вашего запроса. В конечном итоге это закончится, и у вас будет больше результатов, чем вы ожидали.

Кроме того, из-за проблем с инъекциями и моделирования данных вы должны действительно использовать объектную модель доступа к данным (DAO). Я предлагаю исследовать его!

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