C#存储过程或函数需要未提供的参数

我是C#的新手,我正在尝试调用我的数据库中的存储过程,该存储过程需要一个参数。

我得到错误“过程或函数’SP_getName’期望参数’@username’,这是未提供的。”

当我提供参数时,我的存储过程正常工作,我通过SQL管理工作室运行它。

GO DECLARE @return_value int EXEC @return_value = [dbo].[SP_getName] @username = 'bob101' SELECT 'Return Value' = @return_value GO 

但是,当我尝试调用它时,错误是我如何传递参数,但我无法发现问题所在。

  //create a sql command object to hold the results of the query SqlCommand cmd = new SqlCommand(); //and a reader to process the results SqlDataReader reader; //Instantiate return string string returnValue = null; //execute the stored procedure to return the results cmd.CommandText = "SP_getName"; //set up the parameters for the stored procedure cmd.Parameters.Add("@username", SqlDbType.NVarChar).Value = "bob101"; cmd.CommandType = CommandType.Text; cmd.Connection = this.Connection; // then call the reader to process the results reader = cmd.ExecuteReader(); 

任何帮助发现我的错误将不胜感激!

我也试过看这两个post,但我没有运气:

存储过程或函数需要未提供的参数

过程或函数需要参数,该参数未提供

谢谢!

你说过了:

 cmd.CommandType = CommandType.Text; 

因此,您只是执行:

 SP_getName 

这是有效的,因为它是批处理中的第一个语句,因此您可以在没有EXECUTE的情况下调用该过程,但实际上并未包含该参数。 将其更改为

 cmd.CommandType = CommandType.StoredProcedure; 

或者您可以将CommandText更改为:

 EXECUTE SP_getName @username; 

作为旁注,您应该避免为存储过程使用前缀“sp_”

另外一个注意事项是使用IDisposable对象来确保它们被正确处理:

 using (var connection = new SqlConnection("ConnectionString")) using (var cmd = new new SqlCommand("SP_getName", connection)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@username", SqlDbType.NVarChar).Value = "bob101"; connection.Open(); using (var reader = command.ExecuteReader()) { while (reader.Read()) { // Do something } } } 

我有这个问题,但它不是关于命令类型的参数名称。 我的问题是当C#调用SP时,对于没有值的每个参数都传递’default’关键字(我在SQL Profiler中找到它):

 ... @IsStop=0,@StopEndDate=default,@Satellite=0, ... 

在我的情况下,我的参数Type是DateTime:

 @StopEndDate datetime 

。 我通过在存储过程中为此参数设置默认值来解决我的问题:

 @StopEndDate datetime=null 

尝试删除@

 cmd.Parameters.Add("username", SqlDbType.NVarChar).Value = "bob101";