存储过程需要一个我已经传入的参数
我试图使用此声明执行存储过程:
ALTER PROCEDURE [dbo].[getByName] @firstName varchar, @lastName varchar AS ...
我在C#中调用如下:
public List GetPersonByName(string first, string last) { var people = new List(); 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
对于这两个参数,它继续抛出exception。
我已经看到这个问题在两种常见情况下发生了很多次:
-
分配给参数的值为null(或VB.Net中为Nothing)。 这是.Net null,而不是DB null(DBNull.Value),这种情况最常发生在字符串中。
-
正在创建的参数与错误的命令对象相关联。 当您在具有相似名称的同一个类中有多个命令对象时,通常会发生这种情况。
请仔细检查代码以确保字符串变量未设置为null,并且该参数正在添加到正确的命令中。
更新
根据发布的完整更新代码,可能的问题是上面的1。
要在代码中避免此问题,请在方法顶部添加以下内容:
if (first == null) { first = ""; } if (last == null) { last = ""; }
试试这个会起作用:
SqlParameter[] sqlParams = new SqlParameter[] { new SqlParameter("@UserName",(object)userName ?? DBNull.Value), new SqlParameter("@Password",(object)password ?? DBNull.Value) };
如果参数为NULL,则用DBNull Type替换它? 操作者
- 如何从ASP.NET中的数据表/数据视图中选择前n行
- entity framework – 期望’providerInvariantName’参数的非空字符串
- 将大型数据表存储到数据库中的有效方法
- EF Linq to Entities在实体集上调用ToList()会生成包含多个左外连接的SQL命令
- 将byte 数组转换为DataTable
- 为什么在C#时分号不能放在OracleCommand的CommandText中
- SqlDependency notification – 执行查询后立即失败通知
- 有没有办法连接到没有ssl的MySQL数据库?
- 将Ado.net DataReader转换为IDataRecord会产生奇怪的结果