全文搜索存储过程错误

时间:2009-08-15 11:04:54

标签: c# asp.net sql-server-2005 stored-procedures full-text-search

这是我得到的错误:

Syntax error near 'online' in the full-text search condition '""online"*" and "and*" and ""text"*"'. 

这是我的存储过程:

ALTER PROCEDURE dbo.StoredProcedure1
(
    @text varchar(1000)=null    
)
AS
SET NOCOUNT ON

declare @whereclause varchar(1000)


SET @whereclause = @text

SELECT articles.ArticleID AS linkid, 
       articles.abstract as descriptiontext, 
       articles.title as title,
       'article' as source, 
       articles.releasedate as lasteditdate     
 FROM articles
        WHERE  CONTAINS(title, @whereclause)

ORDER BY lasteditdate DESC, source ASC

这是我传递给SP:

string content = "\"online\" and \"text\"";

C#代码的一部分:

 using (SqlConnection cn = new SqlConnection(this.ConnectionString))
            {              
                SqlCommand cmd = new SqlCommand("StoredProcedure1", cn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@text", SqlDbType.VarChar).Value = searchExpression;
                cn.Open();

更新
我尝试的字符串和我得到的错误:

content = "online text";
Syntax error near 'text' in the full-text search condition 'online text'. 

content = "\"online\" and \"text\"";
Syntax error near 'online' in the full-text search condition '""online"*" and "and*" and ""text"*"'. 


content = "\"online and text\"";
Syntax error near 'online*' in the full-text search condition '""online*" and "and*" and "text"*"'. 

6 个答案:

答案 0 :(得分:1)

来自msdn:

指定要在column_name中搜索的文本以及匹配的条件。

是nvarchar。当另一个字符数据类型用作输入时,会发生隐式转换。

由于“参数嗅探”在转换过程中不起作用,因此请使用nvarchar以获得更好的性能。

所以我把所有东西都变成了nvarchar:

cmd.Parameters.Add("@text", SqlDbType.NVarChar).Value = searchExpression;  

declare @whereclause nvarchar(1000)  

答案 1 :(得分:0)

添加参数时,请在c#代码中尝试使用此参数:

cmd.Parameters.Add("@text", searchExpression);

答案 2 :(得分:0)

我认为SQl使用%代替*

答案 3 :(得分:0)

问题在于额外的引号。 而不是:

string content = "\"online\" and \"text\"";

试试这个:

string content = "online and text";

它将生成正确的条件:

 '"online*" and "and*" and "text*"'

此外,如果接受用户输入并将其直接传递到这样的查询中 - 您实际上是在打开SQL注入的应用程序。

答案 4 :(得分:0)

不确定它是否有意义,但您的过程期望varchar,并且您的调用代码说该参数是SqlDbType.Char。 我非常喜欢DeriveParameters:

SqlCommand cmd = new SqlCommand("StoredProcedure1", cn);
cmd.CommandType = CommandType.StoredProcedure;
cn.Open()
SqlCommandBuilder.DeriveParameters cmd;
cmd.Parameters("@text").Value = searchExpression;

答案 5 :(得分:0)

我使用此方法删除斜杠,然后将生成的char数组传递给sp。

public static char[] RemoveBackslash(string value)
{
    char[] c = value.ToCharArray();
    return Array.FindAll(c, val => val != 39).ToArray();
}

string content = "'\"online\" and \"text\"'";

Sqlparam = new SqlParameter("@search", SqlDbType.NVarChar);
Sqlparam.Value = RemoveBackslash(content);
Sqlcomm.Parameters.Add(Sqlparam);