ASP.NET C#中SQL Server波斯文全文检索参数传递报错解决
解决SQL Server全文检索CONTAINS参数化问题(波斯文场景)
问题根源
你在参数化时错误地将SQL语法中的N'""'包裹逻辑放到了参数值里,导致SQL Server把N"متذکر شود"当成了全文检索条件的一部分,而非正确的带双引号的Unicode检索文本,从而触发语法错误。参数化查询中,参数本身会被当作完整字符串值处理,不需要手动添加N'和'前缀后缀。
修正方案
- 构造参数值时仅保留双引号包裹逻辑:只给用户输入的搜索文本添加双引号,去掉
N'和' - 明确指定参数类型为NVarchar:确保参数以Unicode类型传递,无需手动加
N前缀(参数化查询会自动处理)
修正后的完整代码
// 仅给用户输入的文本添加双引号,作为CONTAINS的短语匹配条件 string forwardedSearchText = $"\"{Request.QueryString["SearchText"]}\""; string forwardedSearchColumn; // 由复选框填充,需确保仅包含合法列名避免注入 strsql = $@"SELECT TbSoore.IdSoore, TbSoore.NameSoore, TbAye.NumberAye, TbAye.IdAye, TbAye.TextAye, TbAye.TextTarjome FROM TbAye INNER JOIN TbSoore ON TbAye.IdSoore = TbSoore.IdSoore WHERE CONTAINS(({forwardedSearchColumn}), @forwardedSearchText )"; DataTable dt = new DataTable(); using (SqlConnection con = new SqlConnection(strcon)) { using (SqlCommand cmdSQL = new SqlCommand(strsql, con)) { // 明确指定参数类型为NVarchar,确保Unicode传递 cmdSQL.Parameters.Add("@forwardedSearchText", SqlDbType.NVarChar).Value = forwardedSearchText; con.Open(); dt.Load(cmdSQL.ExecuteReader()); } ListViewSearchResultAye.DataSource = dt; ListViewSearchResultAye.DataBind(); }
补充说明
- 当你指定
SqlDbType.NVarChar时,SQL Server会自动将参数识别为Unicode字符串,等价于直接执行时的N'...'语法,无需手动添加前缀 - 对于动态列名
forwardedSearchColumn,建议维护一个允许的列名白名单,仅允许用户选择白名单内的列,避免SQL注入风险
内容的提问来源于stack exchange,提问作者Zahra
相关产品推荐
相关产品推荐

