从c#向sql执行添加参数时出错

时间:2015-03-26 15:14:02

标签: c# sql-server visual-studio

很抱歉,如果有人已经给出了答案,我一直在浏览网站,并尝试了几个小时的提示和代码,但无济于事。

我有一个存储过程,它基本上检索元素的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对象并浏览参数,我可以看到它就在那里,而且价值是正确的......

那我该怎么办?我犯了一些愚蠢的错误,我看不到......?

1 个答案:

答案 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;

在执行之前的某个地方。

相关问题