我正在尝试使用此声明执行存储过程:
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
这两个参数,但它继续抛出异常。
答案 0 :(得分:7)
我已经看到这个问题在两种常见情况下发生了很多次:
分配给参数的值为null(或VB.Net中为Nothing)。这是.Net null,而不是DB null(DBNull.Value),这最常见于字符串。
正在创建的参数与错误的命令对象相关联。当您在具有相似名称的同一个类中有多个命令对象时,通常会发生这种情况。
请仔细检查代码,以确保字符串变量未设置为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;