这是我得到的错误:
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"*"'.
答案 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);