百度首页 | 百度空间
 
查看文章
 
未能找到带参数的非泛型方法?呵呵见鬼了
2007-11-05 09:20

第一次完全自己编DAL和BLL的函数,就碰上这么鬼的问题呵呵.走运,看来2005虽然变得格外方便了,但对于我们这些想还是想自己控制函数的人来说反而有更多枷锁了.

以下是举的例子:

在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。"

  也有网友说:所以其关键地方在于,ObjectDataSource数据源的参数要与GridView绑定字段的参数相同,这样才不会出现:“未能找到带参数的非泛型方法.....”的问题。

       现在对问题认识比较深刻的Raincen 说:

最近在用ASP.net2.0做一个网站,用的强类型DataSet作为数据层,手写的BLL逻辑层,页面上使用ObjectDataSource作为绑定桥梁,很好用,比Asp.net1.1也省事不少,不过昨天遇到一个问题很是困扰了我!

通常在设计.xsd强类型DataSet时都可以通过Select方法的参数,自动生成Update和Delete方法,这个也很方便。为了实现严谨的分层思想,会在自己的逻辑层里再写这两个方法,这个时候需要注意的地方,就是要保证你的BLL里的方法和生成的方法参数数量、类型要保持一致。不然的话就会出现“未能找到带参数的非泛型方法…”的黄页错误,经过几次实践基本可以避免因参数个数而引发的此类问题,因为每次我会检查生成的方法语句和参数,有多余的地方我会手动清除。

昨天在家突然又报出“未能找到带参数的非泛型方法“UpdateChannel”: channelName, Remark, ID, Channel…” 的黄页,于是首先想到是不是参数个数问题,多次检查发现问题并不在此,搞的很是困扰和郁闷。

我的一个表里有 三个字段:ID,Channel,Remark,在设计DataSet选择了让它自动生成Update方法,在属性栏查看Update方法的三个参数是Channel,Remark,Original_ID,这是没有错的,又检查了我的BLL内的更新方法UpdateChannel(string channelName, string remark, int id),其中参数也是三个,但前的错误提示中有四个参数我怎么也没找到哪有四个参数的方法!

极度郁闷后发现是参数名称的问题, 在我的BLL的Update方法中,为了避免和方法体内的变量冲突,我把对应Cahnnel字段的参数取名为“channelName”,问题就出在这,执行的时候把它识别为新的参数,未能和Channel对应,于是把参数名改为channel,问题马上解决!

不知道大家有没有遇过类似问题, 也不知我的理解是否正确,欢迎讨论!

希望我也可以尽快解决,不过可能会非常麻烦.因为我所有的方法都是重写的.太多了……


类别:c#,sql,以及其他 | 添加到搜藏 | 浏览() | 评论 (2)
 
网友评论:
1
2008-03-28 00:30
谢谢你的答案,以上我遇到的问题解决了,当时现在又遇到了一个问题,在修改的时候填写上新的数据,它不报任何的错误,就是不能更新新的数据!这又是什么原因???
 
2
2008-03-28 08:11
我也遇到过。建议你看看数据库得更新动作,是不是刷新一遍数据库就更新?我做的东西里用到了Cacher,为每一个更新动作建立缓存。如果有两个更新动作的Cacher是重名的话。那么就不会自动更新。
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu