我有这个问题,我试图解决没有任何成功。 我有一个输入研究,我可以用关键词进行研究。我有一个checkBoxList代表不同的主题(Logistic,Administration,Finance ...)来过滤查询。如果我的关键字是"问题"我检查"管理"复选框,结果只会是"问题"与行政有关。它工作正常,但如果我不检查任何复选框,它会导致我OdbcException。我试着用try catch来处理它,但是它被完全忽略了,它没有执行,我仍然得到一个错误..
以下是我的复选框列表研究代码:
<asp:CheckBoxList ID="CheckboxID" runat="server" OnSelectedIndexChanged="CheckboxID_SelectedIndexChanged" AutoPostBack="true">
<asp:ListItem Value="ADV"> ADV </asp:ListItem>
<asp:ListItem Value="Logistique"> Logistique </asp:ListItem>
<asp:ListItem Value="Finance"> Finance </asp:ListItem>
<asp:ListItem Value="EDI"> EDI </asp:ListItem>
<asp:ListItem Value="Administration"> Administration </asp:ListItem>
</asp:CheckBoxList>
<label for="tbSearch">Recherche : </label>
<asp:TextBox ID="tbSearch" runat="server"></asp:TextBox>`
protected void Populate()
{
Occurence = 0;
string word = tbSearch.Text;
string strSql = @"SELECT CAST(ID as VarChar(50)) ID, Aggregation, DateDerniereSolution, DateDescription, DerniereSolution, DescriptionDemande, FileDeTraitement, NomContact, Numero, SousRubrique, TitreDemande
FROM cfao_DigiHelp_index.DigiHelpData WHERE ( 1 = 1 )";
string selectedValue = "";
bool IsFirst = false;
strSql += @" AND (";
foreach (ListItem item in CheckboxID.Items)
{
if (item.Selected)
{
selectedValue = item.Value ;
if (IsFirst)
{
strSql += " OR ";
}
strSql += " SousRubrique Like '%" + selectedValue + "%' ";
IsFirst = true;
}
}
strSql += @" )";
编辑: 得到另一个pb,如果我没有检查任何复选框,我输入一个单词,引导我犯同样的错误,尝试了一切让它工作我疯了
任何想法?
答案 0 :(得分:1)
当我查看您的代码时,如果CheckboxID.Item
为空,则生成字符串...WHERE ( 1 = 1 ) AND ( )
。对我来说,这看起来不是一个有效的语法。
我认为您需要以不同方式处理AND (
和)
- 只有在CheckboxID.Item
中有任何内容时才应该连接它们。
答案 1 :(得分:0)
如果您未选中任何复选框,则您的情况将为AND ()
,从而导致异常。使用此:
string strSql = @"SELECT CAST(ID as VarChar(50)) ID, Aggregation, DateDerniereSolution, DateDescription, DerniereSolution, DescriptionDemande, FileDeTraitement, NomContact, Numero, SousRubrique, TitreDemande
FROM cfao_DigiHelp_index.DigiHelpData";
if (CheckboxID.Items.Cast<ListItem>().Any(x => x.Selected))
{
List<string> conditionList = CheckboxID.Items.Cast<ListItem>().Where(x => x.Selected).Select(item => " SousRubrique Like '%" + item.Value + "%' ").ToList();
strSql += " WHERE (" + string.Join(" OR ", conditionList) + " )";
}
只有在选中至少一个复选框时才会连接字符串。
您需要在文件顶部添加using System.Linq;
答案 2 :(得分:0)
如果没有选择任何项目或者所有if (item.Selected)
评估为False,那么您将收到无效的语法错误,那么您需要做的是仅在选择了And
部分时才附加Checkbox
部分if (CheckboxID.Items.Any(x => x.Selected))
{
strSql +=" AND (";
foreach (ListItem item in CheckboxID.Items)
{
if (item.Selected)
{
selectedValue = item.Value ;
if (IsFirst)
strSql += " OR ";
strSql += " SousRubrique Like '%" + selectedValue + "%' ";
IsFirst = true;
}
}
strSql += @" )";
}
中的项目。我想在执行迭代之前检查是否有任何项目被选中:
+=
还有一件事,使用StringBuilder并避免{{1}}进行连接