期望参数'@ID',没有提供?

时间:2012-03-21 06:18:32

标签: c# .net database sqlcommand

我发送ID作为outparameter但是给出了错误

  

System.Data.SqlClient.SqlException:过程或函数   'usp_ClientHistoryItem'需要参数'@ID',而不是   提供。

代码

 using (SqlCommand cmd = new SqlCommand("dbo.usp_ClientHistoryItem", conn))
 {
      SqlParameter parameterID = new SqlParameter("@ID", oReservation.Id);
      parameterID.Direction = ParameterDirection.Output;
      cmd.Parameters.Add(parameterID); 

      cmd.Parameters.Add(new SqlParameter("@PhoneNo", oReservation.ClientPhone));
      cmd.Parameters.Add(new SqlParameter("@UserId", oReservation.UserID));
      cmd.Parameters.Add(new SqlParameter("@Description", oReservation.Description));
      cmd.Parameters.Add(new SqlParameter("@TestId", oReservation.TestId));
      cmd.Parameters.Add(new SqlParameter("@StartDate", oReservation.StartDate));

      cmd.ExecuteNonQuery();

      returnValue = Convert.ToInt32(cmd.Parameters["@ID"].Value);

      return returnValue;
}

6 个答案:

答案 0 :(得分:39)

您似乎在调用存储过程 - 但您从未定义您的SqlCommand是一个存储过程:

using (SqlCommand cmd = new SqlCommand("dbo.usp_ClientHistoryItem", conn))
{
    cmd.CommandType = CommandType.StoredProcedure;  // add this line to tell ADO.NET it's a stored procedure!!

如果您忘记了该行,那么ADO.NET会尝试将您的内容解释为ad-hoc SQL语句....

答案 1 :(得分:2)

存储过程中的ID参数必须设置为OUTPUT参数。您只是在代码中设置它而不是在存储过程中。

答案 2 :(得分:2)

这个解决了我的问题 可能有帮助

cmd.CommandType = CommandType.StoredProcedure;

答案 3 :(得分:1)

Hy guys。

如果是这种情况,您必须将Command的属性CommandType设置为StoredProcedure。否则它无法检测到参数。

答案 4 :(得分:0)

抛出此错误的另一个原因是当您的存储过程和代码中的变量名称不匹配时,因为代码无法找到必须传递值的参数。确保它们匹配:

存储过程:

create procedure getEmployee
    @ID 
as
Begin
    select * 
    from emp 
    where id = @ID
End

代码:

SqlParameter p = new SqlParameter("@ID", id);
cmd.Parameter.Add(p);

参数@ID必须在代码和存储过程

中匹配

答案 5 :(得分:0)

如果使用 dapper ,则可以使用此构造

int id = 1;

var parameters = new DynamicParameters();

parameters.Add("@id", id, DbType.Int32, ParameterDirection.Input);

string sqlQuery = "[dbo].[SomeStoredProcedure]";

using (IDbConnection db = new SqlConnection(ConnectionString))
{
    var result = await db.QueryAsync<SpResult>(sqlQuery, parameters, commandType: CommandType.StoredProcedure);  
}