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
我相信你在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
的,因为你使用ExecuteNonQuery
和Parameters
结合使用Output
/InputOutput
/Return
。
编辑 -也许下面的工作也可以(虽然不推荐):
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…从…)。