ExecuteScalar返回的结果与Pure SQL不同

本文关键字:Pure SQL 不同 结果 返回 ExecuteScalar | 更新日期: 2023-09-27 18:03:55

我遇到了一个非常有趣的bug(或特性)。

我有一个ADO命令对象,使数据库调用。

调用类似于:

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/query Analyzer中执行相同的查询时,我得到不同的结果。

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

ExecuteScalar返回的结果与Pure SQL不同

我相信你在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);

ExecuteScalar不是用来执行Stored Procedures的,因为你使用ExecuteNonQueryParameters结合使用Output/InputOutput/Return

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

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

编辑 -也许下面的工作也可以(虽然不推荐):

cmd.CommandText = "uspMySearch";
cmd.CommmandType = Command.StoredProcedure;
cmd.Parameters.AddWithValue("@SearchBy", searchBy).Direction = ParameterDirection.InputOutput;

int result = (int)cmd.ExecuteScalar();
var Result = cmd.Parameters ["@SearchBy"].Value;

我大胆猜测一下,但我猜这与你的演员有关。你能把代码改成:

吗?
object result = cmd.ExecuteScalar();

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

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

通常当使用ExecuteScalar()时,我使用一个查询,选择一个列值(即格式SELECT…从…)。