基于用户输入查询MySQL数据库无结果问题排查与解决
MySQL LIKE查询无结果问题排查与解决
我需要实现根据用户输入从MySQL数据库的tfilms表中查询影片的法、英文标题,但明明存在匹配数据(比如输入"ninja"应该返回3条结果),SQL查询却始终返回空结果。
初始错误代码
private void txbSearch_TextChanged(object sender, EventArgs e) { // The query is on several lines for greater readability. string query = @" SELECT titre_fr, titre_en FROM tfilms WHERE titre_fr LIKE '%@text%' OR titre_en LIKE '%@text2%'"; if (txbSearch.Text != "") { using (var databaseConn = new MySqlConnection(conn)) { using (var cmd = databaseConn.CreateCommand()) { cmd.CommandText = query; cmd.Parameters.AddWithValue("@text", txbSearch.Text); cmd.Parameters.AddWithValue("%@text2", txbSearch.Text); DataTable dataTable = new DataTable(); using (var da = new MySqlDataAdapter(cmd)) { da.Fill(dataTable); cmd.CommandTimeout = 60; databaseConn.Open(); MySqlDataReader reader = cmd.ExecuteReader(); if (reader.HasRows) { while (reader.Read()) { // DO SOMETHING } } else // IT ALWAYS LAND HERE. } } } } else RefreshData(); }
问题根源
- SQL语句参数写法错误:
LIKE '%@text%'会让数据库把%@text%当成完整的字符串字面量,而非将@text作为参数替换,相当于查询标题中包含@text字符串的记录,自然找不到匹配结果。 - 参数名定义错误:
AddWithValue("%@text2", ...)里的参数名多了前缀%,导致无法和SQL语句中的@text2匹配,该参数实际未被正确传入。
修正后的代码
将通配符%移到参数值中,同时修正参数名:
private void txbSearch_TextChanged(object sender, EventArgs e) { // The query is on several lines for greater readability. string query = @" SELECT titre_fr, titre_en FROM tfilms WHERE titre_fr LIKE @text OR titre_en LIKE @text2"; if (txbSearch.Text != "") { using (var databaseConn = new MySqlConnection(conn)) { using (var cmd = databaseConn.CreateCommand()) { cmd.CommandText = query; // 将通配符拼接到参数值中 cmd.Parameters.AddWithValue("@text", "%" + txbSearch.Text + "%"); cmd.Parameters.AddWithValue("@text2", "%" + txbSearch.Text + "%"); DataTable dataTable = new DataTable(); using (var da = new MySqlDataAdapter(cmd)) { da.Fill(dataTable); cmd.CommandTimeout = 60; databaseConn.Open(); MySqlDataReader reader = cmd.ExecuteReader(); if (reader.HasRows) { while (reader.Read()) { // DO SOMETHING } } else // 不再进入这里 } } } } else RefreshData(); }
修正后,参数化查询能正确将用户输入和通配符组合,匹配到数据库中包含对应关键词的记录,查询功能恢复正常。
内容的提问来源于stack exchange,提问作者Mathieu Savage
相关产品推荐
相关产品推荐

