【问题标题】:Stored procedure has no parameters and arguments were supplied存储过程没有参数并且提供了参数
【发布时间】:2014-12-12 23:43:53
【问题描述】:

我有一个函数可以从数据库中获取记录。

public List<Issue> Load_Issues()
{
    SqlDataReader Sdr;
    List<Issue> ObjList = new List<Issue>();
    cmd.CommandText = "Get_All_Issue";

    try
    {
        cmd.Connection = con;
        cmd.CommandType = CommandType.StoredProcedure;

        con.Open();
        Sdr = cmd.ExecuteReader();

        while (Sdr.Read())
        {
            // here I pull out records from database..
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        con.Close();
    }

    return ObjList;
}

我用来绑定Gridview的函数如下

public void Bind_Issues()
{
    gdIssues.DataSource = Bl.Load_Issues()();
    gdIssues.DataBind();
}

我的存储过程不接受任何参数。当页面第一次加载时,它工作正常并将记录绑定到 gridview。

我们也可以选择编辑记录,所以在更新记录后我需要再次将记录绑定到 gridview。所以我再次使用我的Load_Issues 函数来做到这一点。但是这次它抛出错误

Get_All_Issues 没有提供参数和参数

【问题讨论】:

  • 您是否将您的cmd 实例重新用于其他查询?
  • 需要处理 Sdr btw
  • 您的 cmd 对象似乎超出了 Load_Issues 函数的范围 - 也许您也将它用于更新逻辑并且参数从那时起就保留在那里?

标签: c# asp.net sql-server gridview


【解决方案1】:

您很可能在多个地方重复使用 cmd 实例,并且您没有清除与其关联的参数,从而创建了您所看到的异常。

最简单的解决方法是不重复使用 cmd,但如果出于某种原因它对您更好,请确保在执行之前对参数使用 Clear。

cmd.Parameters.Clear();

【讨论】:

  • 那么finally阻塞时每次都要清空参数吗??
  • @user3452210,如果你重复使用实例,是的,这样最安全。
【解决方案2】:

尽量不要使用全局连接、命令等:打开和关闭它们方法中

public List<Issue> Load_Issues() {
  //TODO: Put actual connection string here
  using (SqlConnection con = new SqlConnection("Connection String here")) {
    con.Open();

    // Put IDisposable into using
    using (SqlCommand cmd = new SqlCommand()) {
      cmd.Connection = con;
      cmd.CommandText = "Get_All_Issue";
      cmd.CommandType = CommandType.StoredProcedure;

      List<Issue> ObjList = new List<Issue>();

      // Put IDisposable into using 
      using (var Sdr = cmd.ExecuteReader()) {
        while (Sdr.Read()) {
          //TODO: Pull out records from database into ObjList
        }
      } 

      return ObjList; 
    }
  }
}

【讨论】:

  • +1 表示using,在处理一次性物品时非常重要。
【解决方案3】:

试试这些

exec 'stored_procedure_name'
go

alter proc stored_procedure_name
as
begin
    --Block of Statements
end
go

create proc stored_procedure_name
as
begin
    --Block of Statements
end
go

Where go 关键字将解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多