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

时间:2010-02-17 15:55:58

标签: c# .net sql ado.net

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



异常消息

过程或函数'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

4 个答案:

答案 0 :(得分:46)

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

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

答案 1 :(得分:8)

如果'userName'变量的值为null

,您将收到此异常

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

command1.Parameters.Add(new SqlParameter("@UserName", (userName ?? DBNull.Value));   

答案 2 :(得分:3)

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

您可以更改此设置,将SqlCommand的{​​{3}}属性设置为StoredProcedure

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

编辑:我刚刚尝试过,并且在没有将CommandType设置为StoredProcedure(他没有这样做)的情况下获取该错误消息的唯一方法是{{{ 1}}是CommandText。传递EXEC someStoredProcedure参数会产生不同的错误。

答案 3 :(得分:3)

Command1.CommandType = System.Data.CommandType.StoredProcedure

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