MySQL查询本地可执行但C#代码中无结果的问题排查
解决C# MySQL参数化LIKE查询无返回结果的问题
你遇到的问题其实很典型——参数化查询里的LIKE语句写法错误导致的。让我给你拆解一下原因和解决办法:
问题根源
你写的SQL语句里是这样的:
SELECT ... WHERE TAG LIKE '%@MOB%'
这里的问题在于,MySQL会把%@MOB%当成一个完整的字符串字面量,也就是说它不是在找包含你传入的Mobilni变量值的TAG,而是在找包含@MOB这个文本的TAG!这就解释了为什么直接在数据库里替换@MOB为实际值能查到数据,但用C#参数化查询却不行——参数占位符被当成普通字符串了。
两种解决方案
方案1:把%加到参数值里
修改你的C#代码,保持SQL语句里的LIKE只使用参数占位符,然后在传递参数时把%拼接进去:
using (MySqlConnection con = new MySqlConnection(AR.ConnectionString)) { con.Open(); // 修改SQL语句,去掉占位符两边的% using (MySqlCommand cmd = new MySqlCommand(@"SELECT PORUDZBINAID, USERID, BRDOKKOM, DATUM, STATUS, MAGACINID, PPID, INTERNIKOMENTAR, REFERENT_OBRADE, NACIN_PLACANJA, TAG FROM PORUDZBINA WHERE TAG LIKE @MOB", con)) { // 在参数值前后添加% cmd.Parameters.AddWithValue("@MOB", $"%{Mobilni}%"); MySqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) list.Add(new Porudzbina() { PorudzbinaID = Convert.ToInt32(dr[0]), UserID = Convert.ToInt32(dr[1]), BrDokKom = Convert.ToInt32(dr[2]), Datum = Convert.ToDateTime(dr[3]), Status = (PorudzbinaStatus)Convert.ToInt32(dr[4]), MagacinID = Convert.ToInt32(dr[5]), PPID = (dr[6] is DBNull) ? (int?)null : Convert.ToInt32(dr[6]), InterniKomentar = (dr[7] is DBNull) ? null : dr[7].ToString(), ReferentObrade = (dr[8] is DBNull) ? (int?)null : Convert.ToInt32(dr[8]), NacinUplate = (PorudzbinaNacinUplate)Convert.ToInt32(dr[9]), Tag = JsonConvert.DeserializeObject<Properties>(dr["TAG"].ToString()) }); } }
方案2:在SQL语句中使用CONCAT拼接%
如果你更习惯在SQL里处理通配符,可以用MySQL的CONCAT函数来拼接%和参数:
using (MySqlConnection con = new MySqlConnection(AR.ConnectionString)) { con.Open(); // 用CONCAT把%和参数拼接 using (MySqlCommand cmd = new MySqlCommand(@"SELECT PORUDZBINAID, USERID, BRDOKKOM, DATUM, STATUS, MAGACINID, PPID, INTERNIKOMENTAR, REFERENT_OBRADE, NACIN_PLACANJA, TAG FROM PORUDZBINA WHERE TAG LIKE CONCAT('%', @MOB, '%')", con)) { // 参数值保持原样,不用加% cmd.Parameters.AddWithValue("@MOB", Mobilni); MySqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) list.Add(new Porudzbina() { PorudzbinaID = Convert.ToInt32(dr[0]), UserID = Convert.ToInt32(dr[1]), BrDokKom = Convert.ToInt32(dr[2]), Datum = Convert.ToDateTime(dr[3]), Status = (PorudzbinaStatus)Convert.ToInt32(dr[4]), MagacinID = Convert.ToInt32(dr[5]), PPID = (dr[6] is DBNull) ? (int?)null : Convert.ToInt32(dr[6]), InterniKomentar = (dr[7] is DBNull) ? null : dr[7].ToString(), ReferentObrade = (dr[8] is DBNull) ? (int?)null : Convert.ToInt32(dr[8]), NacinUplate = (PorudzbinaNacinUplate)Convert.ToInt32(dr[9]), Tag = JsonConvert.DeserializeObject<Properties>(dr["TAG"].ToString()) }); } }
为什么这样能解决问题
两种方案都是让MySQL正确识别@MOB为参数占位符,而不是字符串的一部分。方案1是在C#里把通配符和参数值合并后传递,方案2是在SQL层面完成通配符的拼接,最终效果是一样的,你可以根据自己的习惯选择。
内容的提问来源于stack exchange,提问作者Aleksa Ristic
相关产品推荐
相关产品推荐

