如何处理OdbcException

时间:2016-06-24 07:33:29

标签: c# .net

我有这个问题,我试图解决没有任何成功。 我有一个输入研究,我可以用关键词进行研究。我有一个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,如果我没有检查任何复选框,我输入一个单词,引导我犯同样的错误,尝试了一切让它工作我疯了

任何想法?

3 个答案:

答案 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}}进行连接