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

本文关键字:参数 #39@ID 期望 | 更新日期: 2023-09-27 18:28:41

我将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;
}

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

您似乎在调用一个存储过程,但您从未将您的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将尝试将您的内容解释为一个特殊的SQL语句。。。。

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

cmd.CommandType = CommandType.StoredProcedure;

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

Hy guys。

如果是这种情况,则必须将命令的属性CommandType设置为StoredProcedure。否则它就检测不到参数。

引发此错误的另一个原因是存储过程和代码中的变量名不匹配,因为代码找不到必须向其传递值的参数。确保它们匹配:

存储过程:

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

代码:

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

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

如果使用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);  
}