c# - 查询返回 0 行

标签 c# asp.net mysql

我正在为招聘网站构建非常简单的搜索引擎。它有 3 个可选输入字段:术语、类别和雇主。术语和雇主字段是文本输入,类别是下拉列表。 搜索逻辑非常愚蠢、复杂且不可扩展,但此搜索只能使用一次,我所需要的只是它适用于少数情况,因为我当时有更重要的事情要做。我没有试图让它变得更好。

该方法返回包含搜索结果的数据集。

private DataSet GetResults(string term, string category, string employer)
{
        string query = "SELECT * FROM Jobs ";

        MySqlConnection conn = DBConnection.Connect();
        MySqlCommand cmd = new MySqlCommand();
        cmd.Connection = conn;
        cmd.CommandType = CommandType.Text;

        if (String.IsNullOrEmpty(term) && String.IsNullOrEmpty(category) && String.IsNullOrEmpty(employer))
        {
            cmd.CommandText = query;
        }
        else
        {
            query += "WHERE ";
            if (!String.IsNullOrEmpty(term))
            {
                query += "Title LIKE '%@term%' OR Job_Desc LIKE '%@term%' ";

                if (!String.IsNullOrEmpty(category))
                    query += "AND Category = @category ";
                if (!String.IsNullOrEmpty(employer))
                    query += "AND Title LIKE '%@employer%' AND Job_Desc LIKE '%@employer%' ";
            }
            else if (!String.IsNullOrEmpty(category))
            {
                query += "Category = @category ";

                if (!String.IsNullOrEmpty(term))
                    query += "AND Title LIKE '%@term%' OR Job_Desc LIKE '%@term%' ";
                if (!String.IsNullOrEmpty(poduzece))
                    query += "AND Title LIKE '%@employer%' OR Job_Desc LIKE '%@employer%' ";
            }
            else if (!String.IsNullOrEmpty(employer))
            {
                query += "Naziv LIKE '%@employer%' OR Job_Desc LIKE '%@poduzece%' ";

                if (!String.IsNullOrEmpty(term))
                    query += "AND Title LIKE '%@term%' OR Job_Desc LIKE '%@term%' ";
                if (!String.IsNullOrEmpty(category))
                    query += "AND Category = '@category' ";
            }
            cmd.CommandText = query;
            cmd.Parameters.AddWithValue("@term", term.Trim());
            cmd.Parameters.AddWithValue("@category", category.Trim());
            cmd.Parameters.AddWithValue("@employer", employer.Trim());
        }

        MySqlDataAdapter dataAdapter = new MySqlDataAdapter(cmd);
        DataSet searchResult = new DataSet();
        dataAdapter.Fill(searchResult);
        conn.Close();
        return searchResult;
    }

问题如下。当我仅搜索术语或雇主时,我得到 0 行返回,但我得到从下拉列表中选择的类别的结果,并且不是使用 LIKE 条件而是使用 = 进行查询。我一开始的猜测是,我的 LIKE 运算符以及 OR 和 AND 出了问题,但是当我使用代码中内置的相同查询手动查询数据库时,我得到了结果。 我的下一个猜测是我的参数出了问题,因为如果我用实际的用户查询替换参数占位符,我会得到结果。

这有效。 query += "标题 LIKE '%C 程序员%' OR Job_Desc LIKE '%C 程序员%' ";

感谢您的帮助,并对英语不好表示歉意。 :)

最佳答案

使用 % 设置 LIKE 运算符中使用的参数值,而不是在查询中使用的参数值

cmd.Parameters.AddWithValue("@term", "%" + term.Trim() + "%");
cmd.Parameters.AddWithValue("@category", category.Trim());             
cmd.Parameters.AddWithValue("@employer",  "%" + employer.Trim() + "%");

当然删除查询文本中的%。此外,不需要像 @category 参数那样在每个字符串参数前面使用单引号

但是此代码需要进一步改进。如果您没有术语值或雇主值,则形成的 SQL 字符串不包含相应参数的占位符。但是,最后会添加所有参数。因此,该命令将因意外参数异常而失败。

关于c# - 查询返回 0 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10029663/

相关文章:

c# - 将字符串转换为颜色

c# - 使用 linq 对数据表列求和

javascript - ASP.NET - 如何从 IE 中隐藏 javascript?

mysql - 了解MySql Auto_Increment

c# - HttpWebRequest 1个url,2个目标ip

c# - 有条件地解析 Unity 中的命名实现

c# - 将图像调整为特定宽度并固定高度

c# - rendersection 的这段代码是什么意思?

php - 如何修复此错误 XML 解析错误 : not well-formed

mysql - 如何使用 SET @variable 为 mysql 中的变量设置值以便在 yii 中查询