2015-11-13 3 views
1

Когда я нажму на элемент checkboxlist2, не выбрав элемент checkboxlist1, затем нажмите кнопку «Поиск ошибки». Я думаю, что checkboxlist2 кодирование является неправильным, пожалуйста, следуйте ниже код:Неправильный синтаксис рядом с ключевым словом «И» в запросе

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!this.IsPostBack) 
    { 
     this.BindGrid(); 
    } 

} 

protected void Button1_Click(object sender, EventArgs e) 
{ 

    this.BindGrid(); 
} 

private void BindGrid() 
{ 
    string conString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString; 
    string query = "SELECT * FROM Table_RegistrationInfo WHERE true"; 
    string condition = string.Empty; 
    foreach (ListItem item in CheckBoxList1.Items) 
    { 
     condition += item.Selected ? string.Format("'{0}',", item.Value) : ""; 
    } 
    if (!string.IsNullOrEmpty(condition)) 
    { 
     condition = string.Format(" AND Nationality in ({0})", condition.Substring(0, condition.Length - 1)); 
    } 
    string condition2 = string.Empty; 
    foreach (ListItem item in CheckBoxList2.Items) 
    { 
     condition2 += item.Selected ? string.Format("'{0}',", item.Value) : ""; 
    } 
    if (!string.IsNullOrEmpty(condition2)) 
    { 
     //condition = string.Format(" where Nationality in ({0})", condition.Substring(0, condition.Length - 1)); 
     condition2 = string.Format(" AND GivenName in ({0})", condition2.Substring(0, condition2.Length - 1)); 
    } 
    SqlCommand cmd = new SqlCommand(query + condition + condition2); using (SqlConnection con = new SqlConnection(conString)) 
    { 
     using (SqlDataAdapter sda = new SqlDataAdapter()) 
     { 
      cmd.Connection = con; sda.SelectCommand = cmd; 
      using (DataSet ds = new DataSet()) 
      { 
       sda.Fill(ds); 
       GridView2.DataSource = ds; 
       GridView2.DataBind(); 
      } 
     } 
    } 


} 
protected void Select_Nationality(object sender, EventArgs e) 
{ 
    this.BindGrid(); 
} 
protected void Select_GivenName(object sender, EventArgs e) 
{ 
    foreach(ListItem item in CheckBoxList1.Items) 
    { 
     if(item.Selected == true) 
     { 
      this.BindGrid(); 
     } 
    } 
} 

Я должен реализовать 8 списков флажок для фильтрации в GridView. Если любые другие простые методы для реализации, и я должен использовать отфильтрованные из 3 таблиц.

+0

Каков ваш окончательный запрос? Перед тем, как выполнить его? Похож на '! String.IsNullOrEmpty (условие)' возвращает 'false', и вы пытаетесь добавить' AND ... 'часть без' WHERE'. –

+0

Каковы результаты 'condition2.Substring (0, condition2.Length - 1)' ?? –

+0

Я не уверен, что вы сделали обязательным, чтобы первое условие не могло быть нулевым, а условие2 не может быть задано с первым условием. Если это так, вам нужно, чтобы условие2 могло добавить AND в запрос, и условие FIrst будет пустым. –

ответ

2

Если condition является нулевым или пустым, ваш запрос будет выглядеть так:

SELECT ... FROM ... AND ... 

, который неверен.

Вы можете исправить это сделать свой «базовый» запрос, как это:

SELECT ... FROM ... WHERE 1=1 

, а затем добавить куски, как AND ... к нему. Ваш запрос становится (если только condition действует:

SELECT ... FROM ... WHERE 1=1 AND condition 

что эквивалентно

SELECT ... FROM ... WHERE condition 

В вашем случае, это изменить:

string query = "SELECT * FROM Table_RegistrationInfo"; 

в

string query = "SELECT * FROM Table_RegistrationInfo WHERE 1=1 "; 

и изменить это:

condition = string.Format(" where Nationality in ({0})", condition.Substring(0, condition.Length - 1)); 

в

condition = string.Format(" AND Nationality in ({0})", condition.Substring(0, condition.Length - 1)); 
+0

все еще я запутался, вы можете обновить в соответствии с приведенным выше кодом. @Bart –

+0

Я обновил свой ответ. –

+0

Выражение небулевого типа, указанное в контексте, где ожидается условие, рядом с «1». –

0

изменить код.

private void BindGrid() 
    { 
     string conString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString; 
     string query = "SELECT * FROM Table_RegistrationInfo"; 
     string condition = string.Empty; 
     foreach(ListItem item in CheckBoxList1.Items) 
     { 
      condition += item.Selected ? string.Format("'{0}',", item.Value) : ""; 
     } 
     if(!string.IsNullOrEmpty(condition)) 
     { 
      condition = string.Format(" where Nationality in ({0})", condition.Substring(0, condition.Length - 1)); 
     } 
     string condition2 = string.Empty; 
     foreach(ListItem item in CheckBoxList2.Items) 
     { 
      condition2 += item.Selected ? string.Format("'{0}',", item.Value) : ""; 
     } 
     if(!string.IsNullOrEmpty(condition2)) 
     { 
     if(!string.IsNullOrEmpty(condition)) 
      { 
      condition+=" And "; 
      } 
     else { 
      Condition +=" Where " 
      } 


    //condition = string.Format(" where Nationality in ({0})", condition.Substring(0, condition.Length - 1)); 
      condition2 = string.Format(" GivenName in ({0})", condition2.Substring(0, condition2.Length - 1)); 
     } 
     SqlCommand cmd = new SqlCommand(query + condition + condition2); 
     using(SqlConnection con = new SqlConnection(conString)) 
     { 
      using(SqlDataAdapter sda = new SqlDataAdapter()) 
      { 
       cmd.Connection = con; 
       sda.SelectCommand = cmd; 
       using(DataSet ds = new DataSet()) 
       { 
        sda.Fill(ds); 
        GridView2.DataSource = ds; 
        GridView2.DataBind(); 
       } 
      } 
     } 

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