ObjectDataSource未能找到带参数的非泛型方法的解决

ObjectDataSource“”未能找到带参数的非泛型方法“DelnewsClass: newsClassID, original_NewsClassid

ObjectDataSource的老报这样的错误.

在网上找了些方法但是都不太让人满意.解决不了问题.

方法1意思就是说 BLL中的参数要和sql存储过程的参数一样.

ASP.Net中对ObjectDataSource自动配置数据源的[删除]操作的时候,会生成两个字段一个是

OldValuesParameterFormatString="original_{0}"

另外一个是

<DeleteParameters>
                                  <asp:Parameter Name="original_XML_ID" Type="Int32" />
                              </DeleteParameters>

这里面OldValuesParameterFormatString是根据你设定的SQL语句中的参数确定的,而Parameter Name却是根据你的业务罗基层中删除函数的第一个参数确定的。
比如,业务逻辑层中你的删除组件是这样定义的,函数中的第一个参数就是ObjectDataSource生成的Parameter Name

      [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Delete, true)]
      public bool DelXML(int original_XML_ID)
      {
          int rowsAffected = Adapter.Delete(original_XML_ID);

          return rowsAffected == 1;
      }


这里要注意的是你BLLDEL函数中的括弧中的参数名称和SQL中的参数名称如果不一样,则会出现“未能找到带参数的非泛型方法”得奇怪错误。不知道算不算是ASP.NETBUG不过确实很讨厌。就连微软官方的教程(www.asp.net)中都没有解决这个BUG
Original_ID


照着上面的方法做了可还是要报错.

于是又继续找

方法二.设置ObjectDataSource   属性OldValuesParameterFormatString="{0}"

修改后果然不报错.

分析

CSDN

开放式并发ASP内建方法

OldValuesParameterFormatString属性的值必须映射到BLL里接收原始值的输入参数的名称。因为我们把这些参数命名为original_productNameoriginal_supplierID等等,我们可以让OldValuesParameterFormatString属性的值依旧是original_{0}。为了ObjectDataSource能够正确地将原始值传送到BLL方法,还有最后一个属性需要设置。不将原始值发送到BLL方法相应的输入参数。

original_{0}

如果让OldValuesParameterFormatString属性设置为除了默认值({0})以外的其它任何的值,都将在数据Web控件尝试调用ObjectDataSourceUpdate()Delete()方法时引发一个错误,因为ObjectDataSource将尝试将这些原始值参数与UpdateParametersDeleteParameters一起传入。注意: 如果你只是简单地从设计视图的属性窗口删除这个OldValuesParameterFormatString属性的值,这个属性依旧会存在于声明语法中,不过被设置为一个空字符串。所以,从声明语法里彻底地删除这个属性,或者从属性窗口将其设置为默认值,{0}

某文章

ObjectDataSource包含了对应它关联的方法的每一个输入参数的parameter,就像当ObjectDataSource被配置为调用预期一个输入参数的查询方法(例如GetProductsByCategoryID(categoryID))时出现的SelectParameters一栏。正如我们马上即将看到的,这些DeleteParametersUpdateParametersInsertParameters的值在调用ObjectDataSourceInsert()Update()Delete()方法之前自动地通过GridViewDetailsViewFormView被设置。必要时这些值也可以通过编程设置,这在以后的章节里讨论。


使用数据源配置向导来配置ObjectDataSource的另一个影响是Visual Studio设置了OldValuesParameterFormatString属性为original_{0} 。这个属性值用来包含数据被编辑时的原始值,它在下面两种情况下非常有用:


·        
如果,当编辑一条记录时,用户可以修改主键的值。在这种情况下,新的主键的值和原始的主键值都需要提供,这样具有这个原始主键值的数据库记录才可以被找到然后才能将它的值更新。

·         当使用开放式并发。开放式并发是为了保证同时操作的用户不至于覆盖另一个用户所做更改的一种技巧,这也是后面的教程中的一节(实现开放式并发)。


这个OldValuesParameterFormatString属性指明了隐含对象的更新和删除方法中对应原始值的输入参数的名称。我们将在探讨开发式并发的时候更详细地讨论这个属性和它的目的。不过暂时我放下它,因为我们的BLL的方法并不需要这些原始的值因此我们删除这个属性,这一点很重要。如果让OldValuesParameterFormatString属性设置为除了默认值({0})以外的其它任何的值,都将在数据Web控件尝试调用ObjectDataSourceUpdate()Delete()方法时引发一个错误,因为ObjectDataSource将尝试将这些原始值参数与UpdateParametersDeleteParameters一起传入。


如果对此不是十分清楚,别担心,我们将在未来的章节中研究这个属性和它的效用。暂时,一定要完全地从声明语法中完全地删除这个属性或者将它设置为默认值({0})。


注意 : 如果你只是简单地从设计视图的属性窗口删除这个 OldValuesParameterFormatString 属性的值,这个属性依旧会存在于声明语法中,不过被设置为一个空字符串。不幸地,这将依旧导致上面提到的同样的问题。所以,从声明语法里彻底地删除这个属性,或者从属性窗口将其设置为默认值, {0}

默认设置下业务层update语句里面的参数和界面层还有业务层select 语句里面的参数个数一定要一样

例如

select id,user,dept from user

若update user

set dept=:a

where user=:b

update语句里面少了id列更新的时候报这个错误,解决办法1select 里去了id列 解决办法2 update语句里加上id列

转载于:https://www.cnblogs.com/wangyingtao/archive/2008/02/05/1064891.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值