很抱歉,如果有人已经给出了答案,我一直在浏览网站,并尝试了几个小时的提示和代码,但无济于事。
我有一个存储过程,它基本上检索元素的id(如果此元素存在),如果不存在则返回零。
我们走了:
PROCEDURE [dbo].[ChecksProductExistence]
@Product_Name varchar(50),
@Return_Value Int output
AS
BEGIN
IF EXISTS (SELECT prod.ProductID
FROM dbo.Products prod
WHERE prod.ProductName = @Product_Name)
SET @Return_Value = 1;
ELSE
SET @Return_Value = 0;
END
好的,到目前为止一切顺利。在我的数据库中执行它,它就像一个魅力...不是它是如此复杂的代码。
然后,在Visual Studio中,我编写了以下代码:
private static bool checkExistingProduct(ShoppingListContext ctx, Product product)
{
var cmd = ctx.Database.Connection.CreateCommand();
cmd.CommandText = "[dbo].[ChecksProductExistence]";
ctx.Database.Connection.Open();
int bla = 0;
SqlParameter inParameter = new SqlParameter();
inParameter.ParameterName = "@Product_Name";
inParameter.SqlDbType = SqlDbType.NVarChar;
inParameter.Direction = ParameterDirection.Input;
inParameter.Value = product.ProductName;
SqlParameter outParameter = new SqlParameter();
outParameter.ParameterName = "@Return_Value";
outParameter.SqlDbType = SqlDbType.Int;
outParameter.Direction = ParameterDirection.Output;
cmd.Parameters.Add(inParameter);
cmd.Parameters.Add(outParameter);
bla = cmd.ExecuteNonQuery();
Console.WriteLine(outParameter.Value);
Console.ReadLine();
if ((int)outParameter.Value == 1) return true; else return false;
}
你可以看到......很简单。我创建一个命令,添加参数,执行它,尝试在输出上做出一些决策。
但是......我在
上收到错误cmd.ExecuteNonQuery();
线。例如,我已将其更改为ExecuteScalar
,但仍然没有运气。我没有使用" bla = ..."执行它,仍然是相同的。
我得到的错误是
类型' System.Data.SqlClient.SqlException'未处理的异常发生在System.Data.dll
中附加信息:程序或功能' ChecksProductExistence'期望参数' @ Product_Name',这是未提供的。
但话又说回来,你不仅可以在代码中清楚地看到我在提供IT,而且在调试会话中我可以探索cmd对象并浏览参数,我可以看到它就在那里,而且价值是正确的......
那我该怎么办?我犯了一些愚蠢的错误,我看不到......?
答案 0 :(得分:2)
如SqlCommand.CommandType
文档中所述,您必须将其设置为CommandType.StoredProcedure
并将CommandText
设置为存储过程的名称。它默认为CommandType.Text
,您必须在查询文本中包含命名参数。
当您将CommandType属性设置为StoredProcedure时,您应该这样做 将CommandText属性设置为存储过程的名称。该 当你调用其中一个时,命令执行这个存储过程 执行方法。
适用于SQL的Microsoft .NET Framework数据提供程序 服务器不支持传递的问号(?)占位符 SQL语句或使用a调用的存储过程的参数 文本的CommandType。在这种情况下,必须使用命名参数。对于 例如:
SELECT * FROM Customers WHERE CustomerID = @CustomerID
所以,只需添加以下内容
即可cmd.CommandType = CommandType.StoredProcedure;
在执行之前的某个地方。