Asp Core Web API中向原生SQL查询正确传递SqlParameter的方法
解决SqlParameter传递后查询返回空的问题
你遇到的核心问题是手动给参数值添加了多余的单引号,SqlParameter会自动处理参数的转义与引号包裹逻辑,额外的引号会导致实际传入的值和你预期的不一致,自然查不到结果。
正确的传递步骤:
- 第一步:移除手动拼接的单引号
不需要给shain.searchAffiliation包裹''',直接使用原始的字符串值即可——参数化查询会自动处理字符串的引号问题,包括值本身含单引号的场景。 - 第二步:调整SqlParameter的创建
直接传入原始属性值,不需要经过tempStr的额外处理:var shainParameterSearchName = new SqlParameter("@searchAffiliation", shain.searchAffiliation ?? DBNull.Value);小提示:如果
shain.searchAffiliation可能为null,建议用DBNull.Value代替,避免参数值为null导致的SQL执行异常。 - 第三步:修正SQL语句字符串
不需要在SQL里给参数值加引号,直接使用参数名即可:
如果你的逻辑是用该参数作为查询条件,直接在WHERE子句里写String affSetStr = " SET @Affiliation = @searchAffiliation ;";= @searchAffiliation就行,完全不用手动处理引号。
为什么原来的方式会返回空?
你之前传入的参数值是'''XXX'''(XXX是实际的部门值),这会导致SQL中@Affiliation被赋值为带三层单引号的字符串,而数据库里存储的是正常的XXX,自然匹配不到任何数据,所以返回空列表。
完整示例代码
// 直接用原始值创建参数 var affiliationParam = new SqlParameter("@searchAffiliation", shain.searchAffiliation ?? DBNull.Value); // 构建参数化SQL语句 string affSetStr = "SET @Affiliation = @searchAffiliation;"; string queryStr = $"{affSetStr} SELECT * FROM YourShainTable WHERE Affiliation = @Affiliation;"; // 执行查询 using (var cmd = new SqlCommand(queryStr, yourDbConnection)) { cmd.Parameters.Add(affiliationParam); // 处理查询结果,比如读取DataTable或实体列表 }
这样既彻底规避了SQL注入风险,又能保证参数值正确传递,查询到预期的结果。
内容的提问来源于stack exchange,提问作者Trí Chồn
相关产品推荐
相关产品推荐

