.net SQL查询表示未提供参数,但已将其添加到SqlCommand对象

dohp0rv5  于 10个月前  发布在  .NET
关注(0)|答案(5)|浏览(137)

我有一个存储过程,它有一个名为用户名的参数,在我后面的代码中,我有一个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

oxcyiej7

oxcyiej71#

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

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

字符串

lg40wkob

lg40wkob2#

如果“userName”变量的值为null,则会出现此异常
如果null有效,则改为将'DBB.Value'传递给数据库:

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

字符串

k97glaaz

k97glaaz3#

Command1.CommandType = System.Data.CommandType.StoredProcedure

字符串
这将强制ExecuteReader执行exec,而不是仅仅尝试将其作为一个平面命令。

0yg35tkg

0yg35tkg4#

默认情况下,CommandText属性需要包含完整的SQL命令,而不仅仅是存储过程的名称。
您可以通过将SqlCommandCommandType属性设置为StoredProcedure来更改此设置。
或者,您可以通过将CommandText更改为"someStoredProcedure @UserName, @ProductCode"来显式传递参数;这是一个完整的SQL语句,可以使用Text的默认值CommandType

编辑:我刚刚试过了,在不将CommandType设置为StoredProcedure(他没有这样做)的情况下得到错误消息的唯一方法是如果CommandTextEXEC someStoredProcedure。传递null参数会给出不同的错误。

vfh0ocws

vfh0ocws5#

NET提供了在.NET平台上运行数据库操作的类,并通过多种方法处理操作结果,其中一个重要的部分是在数据库中执行相关命令并检索其结果,ADO.NET为这部分操作提供了SqlCommand类。
根据你对代码的选择和设计,有几种方法可以管理它。我相信最好的方法是在你的数据库中编写存储过程并在你的代码中执行它们。为了编写正确的代码,你需要在你的SqlCommand对象中设置这些部分:
1 -连接(提供与数据库的连接)
2 - CommandType(检测您选择的执行类型,如简单文本或存储过程)
3 - CommandText(基于CommandType,它可以是存储过程的名称或完整的数据库命令文本)
如果你的命令包含参数(存储过程或简单文本),你必须将它们添加到SqlCommand的Parameters对象中。现在你可以在数据库上运行你的命令并检索结果。
例如,对于阅读数据,您可以选择ExecuteReader()方法(还有其他一些不同的方法),对于DML操作,您可以使用SqlCommand对象的ExecuteNonQuery()方法。
如果你用正确的方法做了,它应该没有问题地工作。
注意事项:这些类在System.Data.SqlClient命名空间中,并针对SQL Server进行了优化。2对于其他供应商,您可以在System.Data.Common包(现代.NET)中使用类似的类。

相关问题