您的位置:首页 > 移动开发 > Objective-C

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

2008-07-08 10:26 232 查看
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;
}

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

照着上面的方法做了可还是要报错.
于是又继续找
方法二.设置ObjectDataSource 属性OldValuesParameterFormatString="{0}"
修改后果然不报错.
分析
CSDN
开放式并发ASP内建方法
OldValuesParameterFormatString属性的值必须映射到BLL里接收原始值的输入参数的名称。因为我们把这些参数命名为original_productName,original_supplierID,等等,我们可以让OldValuesParameterFormatString属性的值依旧是original_{0}。为了ObjectDataSource能够正确地将原始值传送到BLL方法,还有最后一个属性需要设置。不将原始值发送到BLL方法相应的输入参数。
original_{0}
如果让OldValuesParameterFormatString属性设置为除了默认值({0})以外的其它任何的值,都将在数据Web控件尝试调用ObjectDataSource的Update()或Delete()方法时引发一个错误,因为ObjectDataSource将尝试将这些原始值参数与UpdateParameters或DeleteParameters一起传入。注意: 如果你只是简单地从设计视图的属性窗口删除这个OldValuesParameterFormatString属性的值,这个属性依旧会存在于声明语法中,不过被设置为一个空字符串。所以,从声明语法里彻底地删除这个属性,或者从属性窗口将其设置为默认值,{0}。
某文章
ObjectDataSource包含了对应它关联的方法的每一个输入参数的parameter,就像当ObjectDataSource被配置为调用预期一个输入参数的查询方法(例如GetProductsByCategoryID(categoryID))时出现的SelectParameters一栏。正如我们马上即将看到的,这些DeleteParameters、UpdateParameters和InsertParameters的值在调用ObjectDataSource的Insert()、Update()或Delete()方法之前自动地通过GridView、DetailsView和FormView被设置。必要时这些值也可以通过编程设置,这在以后的章节里讨论。

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

· 如果,当编辑一条记录时,用户可以修改主键的值。在这种情况下,新的主键的值和原始的主键值都需要提供,这样具有这个原始主键值的数据库记录才可以被找到然后才能将它的值更新。
· 当使用开放式并发。开放式并发是为了保证同时操作的用户不至于覆盖另一个用户所做更改的一种技巧,这也是后面的教程中的一节(实现开放式并发)。

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

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

注意: 如果你只是简单地从设计视图的属性窗口删除这个OldValuesParameterFormatString属性的值,这个属性依旧会存在于声明语法中,不过被设置为一个空字符串。不幸地,这将依旧导致上面提到的同样的问题。所以,从声明语法里彻底地删除这个属性,或者从属性窗口将其设置为默认值,{0}。
作者:山东 莱州 王英涛
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐