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

今天做一个简单的网上书店 在做搜索商品页时用到了ListView分页,即将根据商品名称或描述搜索到的商品分页,我将数据集中查询某一页的sql语句定义为:

SELECT *
FROM (SELECT Id, ProductID, Name, Description, Image, Listprice, Numinstock, CategoryId,
              row_number() OVER (ORDER BY id) rownum
FROM Catalog
WHERE (Name LIKE '%' + LTRIM(RTRIM(@mmNameStr)) + '%') OR
      (Description LIKE '%' + LTRIM(RTRIM(@mmNameStr)) + '%')) t
WHERE t .rownum > @startRowIndex AND
      t .rownum <= @startRowIndex + @maximumRows

 

将查询所有满足条件的记录条数的查询定义为:

SELECT COUNT(*) AS Expr1
FROM Catalog
WHERE (Name LIKE '%' + LTRIM(RTRIM(@mmNameStr)) + '%') OR
      (Description LIKE '%' + LTRIM(RTRIM(@mmNameStr)) + '%')

 

这样便成功分页了。但接下来又遇到了一个难题:

 

就是要实现一个更复杂的搜索功能,增加根据商品种类查询:

这时有两种解决方案:一是修改查询某一页的sql语句,将两个查询条件整合到一起,不过我感觉这样安全性不是很好,除非用存储过程。

 

第二种方案将根据种类查询的条件单独定义:

//查询某一页的sql语句

SELECT *
FROM (SELECT id, productid, name, description, image, listprice, numinstock, categoryid,
              row_number() OVER (ORDER BY id) rownum
FROM catalog
WHERE categoryid = @categoryid) t
WHERE t .rownum > @startRowIndex AND
      t .rownum <= @startRowIndex + @maximumRows

 

//查询所有满足条件的记录条数的查询

SELECT COUNT(*) FROM Catalog where CategoryId=@categoryid

 

 

最后我选择了第二种方法,但在添加查询某一页的sql语句时categoryid参数老是不能自动添加上,无奈只能比着mmNameStr参数手动添加,并在查询结果页面加载的时候修改objectDataSource的SelectMethod和SelectCountMethod,可是添加完后测试老是报“未能找到带参数的非泛型方法”的错误,后来我发现源代码中有:


                            Type="String" />

于是我又添加了:


               

 可修改完后还是报“未能找到带参数的非泛型方法”。

 

整了好久都没解决,反正我知道,错误的根源肯定就是,在添加根据种类查询某一页的sql语句时参数不能自动添加。

 

后来我又一想干脆再添加一个ObjectDataSource,当搜索结果页加载的时候修改ListView的DataSourceID,说做就做。

修改完成后,又给新加的ObjectDataSource添加了下面的代码:


               

 

OK  一切正常 。终于又解决了一个问题,虽然方法有可能有点笨拙,但我很欣慰。

 

你可能感兴趣的:(ASP.NET)