You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 09:57:39