ExecuteScalar返回与Pure SQL不同的结果

时间:2011-07-28 15:16:54

标签: c# sql-server .net-4.0 ado.net

我遇到了一个非常有趣的错误(或功能)。

我有一个调用数据库的ADO Command对象。

电话看起来类似于:

cmd.CommandText = "uspMySearch";
cmd.CommmandType = Command.StoredProcedure.
cmd.Parameters.AddWithValue("@SearchBy", searchBy)
// The value of searchBy is: '( FORMSOF (INFLECTIONAL, steve''s) AND FORMSOF (INFLECTIONAL, game) )'

int result = (int)cmd.ExecuteScalar();

// The result returned is 0.  I was expecting 1.

当我在SQL /查询分析器中执行相同的查询时,我得到了不同的结果。

sql看起来像这样:

EXEC uspMySearch @SearchBy = '( FORMSOF (INFLECTIONAL, steve''s) AND FORMSOF (INFLECTIONAL, game) )'

// The result returned is 1.  This is the expected result.

为了确认我正在调用正确的存储过程,我修改了uspMySearch以返回一个随机数。我正在呼叫正确的Sp!

任何人都对这里发生什么有任何见解?

感谢。

史蒂夫

环境

SQL / Server 2008 R2

.NET 4.0

4 个答案:

答案 0 :(得分:1)

我相信你在C#的searchBy变量中有一个无关的单引号,试试:

// note steve's rather than steve''s, shouldn't need to escape the single quote
string searchBy =
    "( FORMSOF (INFLECTIONAL, steve's) AND FORMSOF (INFLECTIONAL, game) )";
...
cmd.Parameters.AddWithValue("@SearchBy", searchBy);

int result = (int)cmd.ExecuteScalar();

@FlyingStreudel在评论中提出的另一种可能性是,您的存储过程没有使用SELECT来返回值。如果您使用的是RETURN,则应尝试:

var retval = new SqlParameter("@RETVAL", SqlDbType.Int);
retval.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(retval);
...
cmd.ExecuteNonQuery();

int result = Convert.ToInt32(retval.Value);

答案 1 :(得分:1)

ExecuteScalar不是用于执行Stored Procedures - 因为您使用ExecuteNonQueryParameters结合使用Output / InputOutput / { {1}}。

http://msdn.microsoft.com/en-us/library/system.data.parameterdirection.aspx

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx

编辑 - 也许以下工作也有效(虽然不推荐):

Return

答案 2 :(得分:0)

我会抛出疯狂的猜测,但我猜它与你的演员有关。您可以将代码更改为:

object result = cmd.ExecuteScalar();

使用调试器检查result变量以查看它是什么(以及它的类型)。这可能会给你(或我)一个关于发生了什么的线索。

答案 3 :(得分:0)

当你说返回的结果是1时 - 它是如何返回的;结果集还是打印出来的?

通常在使用ExecuteScalar()时,我使用一个选择单个列值的查询(即格式为SELECT ... FROM ...)。