我最近利用Gridview实现更新操作出现一问题“/iPOSTBlogSys”应用程序中的服务器错误。
--------------------------------------------------------------------------------ObjectDataSource“ObjectDataSource2”未能找到带参数的非泛型方法“UpdateblogVisibleCommend”: UserID, a, b, BlogState, CommendOrnot。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidOperationException: ObjectDataSource“ObjectDataSource2”未能找到带参数的非泛型方法“UpdateblogVisibleCommend”: UserID, a, b, BlogState, CommendOrnot。源错误: 执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。  堆栈跟踪: 
[InvalidOperationException: ObjectDataSource“ObjectDataSource2”未能找到带参数的非泛型方法“UpdateblogVisibleCommend”: UserID, a, b, BlogState, CommendOrnot。]
   System.Web.UI.WebControls.ObjectDataSourceView.GetResolvedMethodData(Type type, String methodName, IDictionary allParameters, DataSourceOperation operation) +1440
   System.Web.UI.WebControls.ObjectDataSourceView.ExecuteUpdate(IDictionary keys, IDictionary values, IDictionary oldValues) +2292
   System.Web.UI.DataSourceView.Update(IDictionary keys, IDictionary values, IDictionary oldValues, DataSourceViewOperationCallback callback) +179
   System.Web.UI.WebControls.GridView.HandleUpdate(GridViewRow row, Int32 rowIndex, Boolean causesValidation) +1140
   System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +835
   System.Web.UI.WebControls.GridView.OnBubbleEvent(Object source, EventArgs e) +162
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +56
   System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(Object source, EventArgs e) +118
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +56
   System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +107
   System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +175
   System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +31
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +32
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +244
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint
 
protected void gdvBlogState_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
            ObjectDataSource2.UpdateParameters[0].DefaultValue =e.Keys[0].ToString();//userid
            ObjectDataSource2.UpdateParameters[1].DefaultValue = e.NewValues[0].ToString();//false      a
            ObjectDataSource2.UpdateParameters[2].DefaultValue = e.NewValues[1].ToString();//false       b
            ObjectDataSource2.Update();            gdvBlogState.DataBind();
    }//类
 public int UpdateblogVisibleCommend(int userid,bool a,bool b)//更新所有博客是否可见,是否推荐的信息
    {
        string connectstr = @"Data Source=198E\SQLEXPRESS;Initial Catalog=iPostDB;User ID=linfeng;Password=linfeng";
        SqlConnection cmdconnect = new SqlConnection(connectstr);
        string cmd = "update blog set BlogState='" + a + "',CommendOrnot='" + b + "' where UserID='" + userid + "'";
        SqlCommand cmdstr = new SqlCommand(cmd, cmdconnect);
        int i = 0;
        cmdconnect.Open();
        i=cmdstr.ExecuteNonQuery();
        cmdconnect.Close();
        return i;
    }

解决方案 »

  1.   

    既然已经使用了ObjectDataSource,又何必再写方法UpdateblogVisibleCommend,直接设置ObjectDataSource的属性即可,而且
    string cmd = "update blog set BlogState='" + a + "',CommendOrnot='" + b + "' where UserID='" + userid + "'"; 
    这句很有问题,最起码也应该以参数的方式写出来,比如
    string cmd = "update blog set BlogState= @BlogState,CommendOrnot= @CommendOrnot where UserID = @UserID"; 将来给参数赋值也可以是
    ObjectDataSource2.UpdateParameters["UserID"].DefaultValue =e.Keys[0].ToString();//userid 
    ObjectDataSource2.UpdateParameters["BlogState"].DefaultValue = e.NewValues[0].ToString();//false      a 
    ObjectDataSource2.UpdateParameters["CommendOrnot"].DefaultValue = e.NewValues[1].ToString();//false      b 
      

  2.   

    在正常情况下,设置ObjectDataSource的属性即可,如果是GridView不需要手动添加更新代码
      

  3.   

    你写的UpdateblogVisibleCommend方法只有三个参数,而错误提示中说明了“需要5测参数的那个重载方法”,你的方法肯定不匹配。你看看你动了ObjectDataSource2的哪个属性。
      

  4.   

    由于我只是要更新部分属性,所以就写了一个新的方法,结果就出现了如上的问题。
    ==
    还是看你的更新语句,不需要修改的列如果是BoundField就设置其ReadOnly = "true",如果是TemplateField,就删除其EditTemplate
      

  5.   

    建议楼主看看http://truly.cnblogs.com/archive/2006/06/29/438526.html
      

  6.   

    刚刚随便改了一下。
    public int UpdateblogVisibleCommend(int userid,bool blogstate,bool commendornot)
        { 
            string connectstr = @"Data Source=198E\SQLEXPRESS;Initial Catalog=iPostDB;User ID=linfeng;Password=linfeng"; 
            SqlConnection cmdconnect = new SqlConnection(connectstr); 
            string cmd = "update blog set BlogState='" + blogstate + "',CommendOrnot='" + commendornot + "' where UserID='" + userid + "'"; 
            SqlCommand cmdstr = new SqlCommand(cmd, cmdconnect); 
            int i = 0; 
            cmdconnect.Open(); 
            i=cmdstr.ExecuteNonQuery(); 
            cmdconnect.Close(); 
            return i; 
        }现在运行,没有问题了。
    不解???????????