2013-03-22 8 views
0

Я работаю над программой, которая будет запрашивать личную базу данных фильмов. Морщины в плане выбирают жанры. Например, допустим, у меня есть 3 флажка Action, Adventure и Comedy. Фильм может попасть в один жанр или несколько жанров. Фильм может быть действием или действием/комедией.Запрос на основе флажков

Ниже приведен фрагмент кода, с которого я начал ... но не учитывает все варианты. Функция Fill_Grid заполняет dataGridView. Он работает, если фильм имеет один жанр или пользователь выбирает точно такие же жанры, что и у фильма в базе данных. Что должно случиться, если фильм - Комедия действия, он должен появиться, если пользователь выбирает только действие или только комедию ИЛИ Действие и Комедию.

Пожалуйста, задавайте вопросы, если это не имеет смысла.

Спасибо заранее, -J

 string str_SQL = "SELECT Name, File, Action, Fantasy, Horror, Thriller, Adventure, Animation, Comedy, Crime, Documentary, Drama, Family, Games, Mystery, Romance, SciFi, War FROM tbl_Main WHERE Action = " + chk_Action.Checked + 
      " AND Fantasy = " + chk_Adv.Checked + 
      " AND Horror = " + chk_Hor.Checked + 
      " AND Thriller = " + chk_Thrill.Checked + 
      " AND Adventure = " + chk_Adv.Checked + 
      " AND Animation = " + chk_Anim.Checked + 
      " AND Comedy = " + chk_Com.Checked + 
      " AND Crime = " + chk_Crime.Checked + 
      " AND Documentary = " + chk_Doc.Checked + 
      " AND Drama = " + chk_Drama.Checked + 
      " AND Family = " + chk_Fam.Checked + 
      " AND Games = " + chk_Game.Checked + 
      " AND Mystery = " + chk_Mys.Checked + 
      " AND Romance = " + chk_Rom.Checked + 
      " AND SciFi = " + chk_Sci.Checked + 
      " AND War = " + chk_War.Checked + ";"; 

      Fill_Grid(str_SQL); 
+3

Вы всегда должны использовать [_parameterized queries_] (http://www.codinghorror.com/blog/2005/04/give-me- parameterized-sql-or-give-me-death.html) Этот тип кодов открыт для атак [_SQL Injection_] (http://en.wikipedia.org/wiki/SQL_injection). –

+0

@Tom - потому что если у вас есть комедия действий, и вы проверяете действие и романтику, он все равно будет возвращен. – LittleBobbyTables

+2

Я первый, кто указал новичкам на опасности SQL Injection, но в этом случае я не вижу, как это может произойти – Steve

ответ

0

Ниже приведен фрагмент кода ниже. Спасибо всем за вход, вы меня движется в правильном направлении

string str_Checkboxes=""; 
string str_SQL = "SELECT Name, File, Action, Fantasy, Horror, Thriller, Adventure, Animation, Comedy, Crime, Documentary, Drama, Family, Games, Mystery, Romance, SciFi, War FROM tbl_Main WHERE "; 

//Loop through each control on the form, we are looking for checkboxes 
foreach (Control c in this.Controls) 
{ 
    if(c is CheckBox) 
    { 
     if (((CheckBox)c).Checked) 
     { 
     //Bypass putting AND at the beginning of str_Checkboxes 
     if(str_Checkboxes != "") 
      str_Checkboxes+=" AND "; 
     //Checkbox text is the same as the field name in the database 
      str_Checkboxes += (((CheckBox)c).Text) + " = True"; 
     } 
    } 
    } 
//build the SQL 
str_SQL += str_Checkboxes + ";"; 
//Fill the grid 
Fill_Grid(str_SQL); 
2

Смотрите, если флажок установлен первым. Затем добавьте его в запрос.

if (chk_Adv.Checked == true) { 
    str_SQL = str_SQL+" AND Fantasy = 1" 
} 
+0

Программа является автономной. Замена всех AND с помощью OR не работает. Он будет возвращать все данные независимо от того, что было выбрано. К сожалению, я не знаком с параметризованными запросами. – JMJ

0

Попробуйте это, если все столбцы типа данных в SQL bit:

string str_SQL = "SELECT Name, File, Action, Fantasy, Horror, Thriller, Adventure, Animation, Comedy, Crime, Documentary, Drama, Family, Games, Mystery, Romance, SciFi, War FROM tbl_Main WHERE Action = " + chk_Action.Checked + 
" AND Fantasy = " + chk_Adv.Checked?-1 :0 + 
" AND Horror = " + chk_Hor.Checked ? -1 : 0 + 
" AND Thriller = " + chk_Thrill.Checked ? -1 : 0 + 
" AND Adventure = " + chk_Adv.Checked ? -1 : 0 + 
" AND Animation = " + chk_Anim.Checked ? -1 : 0 + 
" AND Comedy = " + chk_Com.Checked ? -1 : 0 + 
" AND Crime = " + chk_Crime.Checked ? -1 : 0 + 
" AND Documentary = " + chk_Doc.Checked ? -1 : 0 + 
" AND Drama = " + chk_Drama.Checked ? -1 : 0 + 
" AND Family = " + chk_Fam.Checked ? -1 : 0 + 
" AND Games = " + chk_Game.Checked ? -1 : 0 + 
" AND Mystery = " + chk_Mys.Checked ? -1 : 0 + 
" AND Romance = " + chk_Rom.Checked ? -1 : 0 + 
" AND SciFi = " + chk_Sci.Checked ? -1 : 0 + 
" AND War = " + chk_War.Checked ? -1 : 0 + ";"; 

Fill_Grid(str_SQL); 

Update , если вы используете в MS-доступа и тип данных Yes/No, то верно = -1 и ложь = 0, check here

+0

Это в базе данных Access, поэтому тип bolean я предполагаю, так как флаги Y/N или T/F. Приведенный выше код не работает. Спасибо за вход Arshad – JMJ

+0

Истина '-1' в Access – Brad

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