我发送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;
}
答案 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);
}