我遇到了一个非常有趣的错误(或功能)。
我有一个调用数据库的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
答案 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
- 因为您使用ExecuteNonQuery
与Parameters
结合使用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 ...)。