SQL Query表示未提供参数,但会将其添加到SqlCommand对象中

我有一个存储过程,其中有一个名为UserName的参数,在我的代码后面我有一个SqlCommand对象,我使用Add方法添加参数。 但由于某些原因,当命令对象尝试运行ExecuteReader方法时,它会抛出exception。 我完全不知所措,不知道为什么它没有识别参数。 在运行ExecuteReader方法之前,我有一个断点设置,所以我可以确认命令对象确实包含正在设置的参数,这是真的。 我知道当参数未添加到命令对象时,存储过程确实返回正确的数据,但在实际存储过程中是硬编码的。 下面是catch块中给出的exception消息。 我还将粘贴我的代码和存储过程的第一部分。 我非常感谢这个问题的任何帮助,看到我尝试了许多不同的方法无济于事。 提前致谢。

例外消息

过程或函数’someStoredProcedure’需要参数’@UserName’,这是未提供的。

代码背后

private DataTable GetLossMitData(string code, DateTime? start, DateTime? end) { DataTable results = new DataTable(); string connectionString = ConfigurationManager.ConnectionStrings["asdf"].ConnectionString; string userName = String.Empty; try { using (SPSite site = new SPSite(ConfigurationManager.AppSettings["someName"])) { using (SPWeb web = site.OpenWeb()) { userName = web.CurrentUser.Email.ToString(); } } using (SqlConnection connection1 = new SqlConnection(connectionString)) { connection1.Open(); using (SqlCommand command1 = new SqlCommand("someStoredProcedure", connection1)) { command1.Parameters.Add(new SqlParameter("@UserName", userName)); command1.Parameters.Add(new SqlParameter("@ProductCode", code)); SqlDataReader dr = command1.ExecuteReader(CommandBehavior.CloseConnection); results.Load(dr); } connection1.Close(); } } catch (Exception ex) { } return results; } 

存储过程

 @UserName nvarchar(256), @ProductCode nvarchar(256), @StartDate nvarchar(256) = '1/1/1900', @EndDate nvarchar(256) = '12/30/2012' AS BEGIN SET NOCOUNT ON; Declare @UserID int Select @UserID = Users.UserID from Users where Users.Email = @UserName 

尝试确保将命令类型设置为存储过程。

 mycommand.CommandType = System.Data.CommandType.StoredProcedure; 

如果’userName’变量的值为null,则会出现此exception

如果null有效,则将“DBNull.Value”传递给db:

 command1.Parameters.Add(new SqlParameter("@UserName", (userName ?? DBNull.Value)); 
 Command1.CommandType = System.Data.CommandType.StoredProcedure 

这将强制ExecuteReader执行exec而不是仅将其作为flat命令执行。

默认情况下, CommandText属性需要包含完整的SQL命令,而不仅仅是存储过程的名称。

您可以通过将SqlCommandCommandType属性设置为StoredProcedure来更改此设置。

或者,您可以通过将CommandText更改为"someStoredProcedure @UserName, @ProductCode"来显式传递参数; 这是一个完整的SQL语句,可以使用Text的默认CommandType

编辑 :我刚试过它,并且没有将CommandType设置为StoredProcedure (他没有做)的唯一方法是获取该错误消息,如果CommandTextEXEC someStoredProcedure 。 传递null参数会产生不同的错误。