ADO.NET進行參數化時會自動將參數值包含在單引號中,除了特殊需求,最好不要自己手動添加單引號。ADO.NET中識別參數標識是使用符號@,如果在SQL語句中將參數標識放在單引號中,單引號中的參數標識只會被當成字元串! 所以要對LIKE語句進行參數化查詢時,就要先對參數值進行格式化,在傳參之前就設置 ...
ADO.NET進行參數化時會自動將參數值包含在單引號中,除了特殊需求,最好不要自己手動添加單引號。ADO.NET中識別參數標識是使用符號@,如果在SQL語句中將參數標識放在單引號中,單引號中的參數標識只會被當成字元串!
所以要對LIKE語句進行參數化查詢時,就要先對參數值進行格式化,在傳參之前就設置好通配符,具體實現代碼如下:
string sql = "SELECT * FROM STORE_IN_TYPE where del_status = 0"; SqlParameter[] paras = { }; //商品名稱 if (itype_name != "") { string quanpin = XTools.XHelper.PinYinHelper.GetFull(itype_name).Trim().ToLower(); string szm = XTools.XHelper.PinYinHelper.GetFrist(itype_name).Trim().ToLower(); sql += $@" and (itype_name like @goods_name or itype_name_py like @quanpin or itype_name_fpy like @szm)"; paras = new SqlParameter[]{ XTools.XDB.SQLHelper.GetParameter("@goods_name", "%"+itype_name+"%",SqlDbType.VarChar,64), XTools.XDB.SQLHelper.GetParameter("@quanpin", "%"+quanpin+"%",SqlDbType.VarChar,64), XTools.XDB.SQLHelper.GetParameter("@szm", "%"+szm.Replace(" ", "")+"%",SqlDbType.VarChar,64) }; } sql += " and create_time>= '" + dt1.ToString("yyyy-MM-dd HH:mm:ss") + "' and create_time<= '" + dt2.ToString("yyyy-MM-dd HH:mm:ss") + "' "; SqlDataReader reader = XTools.XDB.SQLHelper.GetReader(sql,paras);
從上面的代碼中我們可以看到具體的變換有兩點,第一點是SQL語句中取消了通配符%並且參數標識沒有被單引號包含其中,第二點則是通配符直接放到了參數值中,這樣ADO.NET在進行參數化後所生成的SQL就完全沒問題了,最終也能正確的查詢出結果。