存储过程需要一个我已经传入的参数

时间:2013-12-27 19:20:12

标签: c# sql-server tsql stored-procedures ado.net

我正在尝试使用此声明执行存储过程:

ALTER PROCEDURE [dbo].[getByName]
    @firstName varchar,
    @lastName varchar
AS
...

我在C#中调用如下:

public List<Person> GetPersonByName(string first, string last)
{
    var people = new List<Person>();
    var connString = ConfigurationManager.ConnectionStrings["MyDbConnString"].ConnectionString;
    using (var conn = new SqlConnection(connString))
    {
        using (var cmd = new SqlCommand("dbo.getByName",conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@firstName", SqlDbType.VarChar, 50)).Value = first;
            cmd.Parameters.Add(new SqlParameter("@lastName", SqlDbType.VarChar, 50)).Value = last;
            conn.Open();
            using (var reader = cmd.ExecuteReader())
            {
                people = ReadPeopleData(reader);
            }
            conn.Close();
        }
    }
    return people;
}

但我刚刚收到这个错误:

  

过程或函数'getByName'需要未提供的参数'@firstName'。

更新:

ALTER PROCEDURE [dbo].[getEmployeesByName]
    @firstName varchar(50),
    @lastName varchar(50)
AS
...

并说明:

cmd.Parameters.Add(new SqlParameter("@firstName", SqlDbType.VarChar, 50)).Value

这两个参数,但它继续抛出异常。

3 个答案:

答案 0 :(得分:7)

我已经看到这个问题在两种常见情况下发生了很多次:

  1. 分配给参数的值为null(或VB.Net中为Nothing)。这是.Net null,而不是DB null(DBNull.Value),这最常见于字符串。

  2. 正在创建的参数与错误的命令对象相关联。当您在具有相似名称的同一个类中有多个命令对象时,通常会发生这种情况。

  3. 请仔细检查代码,以确保字符串变量未设置为null,并且该参数正在添加到正确的命令中。

    <强>更新

    根据发布的完整更新代码,可能的问题是上面的1。

    要解决代码中的此问题,请在方法顶部添加以下内容:

    if (first == null) {
      first = "";
    }
    if (last == null) {
      last = "";
    }
    

答案 1 :(得分:1)

试试这个会起作用:

SqlParameter[] sqlParams = new SqlParameter[] { 
            new SqlParameter("@UserName",(object)userName ?? DBNull.Value),
            new SqlParameter("@Password",(object)password ?? DBNull.Value)
};

如果参数为NULL,则用DBNull Type替换它?操作者

答案 2 :(得分:0)

请将CommandaType添加到SQLCommand。

例如:scmd.CommandType = CommandType.StoredProcedure;