2013-12-09 5 views
1

Я пытаюсь получить DataTable, содержащий дома в определенном городе с номерами между х и у.Почему этот SQL-запрос не извлекает данные?

Я использую этот SQL-запрос:

"SELECT * FROM Houses WHERE City = '" + Cities.Text + 
"' AND Rooms BETWEEN '" + MinRooms.Text + "' AND '" + MaxRooms.Text + "'" 

Элементы управления DropDownLists в ASP.NET.

Когда я удаляю его и оставляю только «между комнатами», он работает.

Что я должен искать? Все кажется правильным.

+2

Remove '(апостроф), используемый с BETWEEN - только в случае, если номер является числовым столбцом. –

+6

В качестве важного аспекта ваш код уязвим для ** SQL-инъекций ** (Google это! Очень важно!). Чтобы этого избежать, вам нужно реализовать что-то, называемое ** параметризованным запросом ** (это также Google). –

+1

Поместите контрольную точку отладки в строку после создания строки SQL и посмотрите на запрос. Похоже, вы ожидаете? Также обратите внимание, что построение запросов в виде строки из пользовательского ввода может привести к SQL Injection; используйте вместо этого [параметризованные запросы] (http://bobby-tables.com/csharp.html). –

ответ

6

Я предполагаю, что Rooms является int столбец, поэтому вам нужно удалить апостроф, которые для текстовых столбцов. Но вы должны использовать SQL-параметры, чтобы предотвратить SQL-инъекцию в любом случае:

string sql = @"SELECT h.* FROM Houses h 
       WHERE City = @City 
       AND Rooms BETWEEN @MinRooms AND @MaxRooms"; 
var table = new DataTable(); 
using(var con = new SqlConnection(Properties.Settings.Default.ConnectionString)) 
using(var da = new SqlDataAdapter(sql, con)) 
{ 
    da.SelectCommand.Parameters.AddWithValue("@City", Cities.Text); 
    da.SelectCommand.Parameters.AddWithValue("@MinRooms",int.Parse(MinRooms.Text)); 
    da.SelectCommand.Parameters.AddWithValue("@MaxRooms",int.Parse(MaxRooms.Text)); 
    da.Fill(table); 
} 
+1

+1 для параметризованного запроса. – Shiva

+0

+1 для ваших усилий :) –

1
String sql = String.Format("SELECT * FROM Houses WHERE City = '{0}' AND Rooms BETWEEN {1} AND {2}", 
    Cities.Text, MinRooms.Text, MaxRooms.Text); 

Не игнорировать SQL вопрос впрыска ...

+2

Использование 'string.Format' не является заменой для sql-параметров (только для уточнения) –

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