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

ASP.NET C#中SQL Server波斯文全文检索参数传递报错解决

解决SQL Server全文检索CONTAINS参数化问题(波斯文场景)

问题根源

你在参数化时错误地将SQL语法中的N'""'包裹逻辑放到了参数值里,导致SQL Server把N"متذکر شود"当成了全文检索条件的一部分,而非正确的带双引号的Unicode检索文本,从而触发语法错误。参数化查询中,参数本身会被当作完整字符串值处理,不需要手动添加N'和'前缀后缀。

修正方案

  1. 构造参数值时仅保留双引号包裹逻辑:只给用户输入的搜索文本添加双引号,去掉N'和'
  2. 明确指定参数类型为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:12:44