【发布时间】:2021-03-28 18:46:20
【问题描述】:
我遇到了一个非常奇怪的问题。我正在将 ASP.Net ListView 上的数据源从 SqlDataSource 交换到 ObjectDataSource。除了两个参数没有从 ObjectDataSource 传递到 Table Adapter 之外,一切都运行良好。共有四个参数。三个整数和一个字符串。它们被命名为搜索、状态、类别和子类别。每当脚本管理器导航或单击按钮时,所有默认值都会更改。除了 category 和 subcategory 为 null 之外,一切正常。
当类别和子类别为空时,空值不会传递给表适配器,也不会从数据库中提取数据。我知道存储过程和表适配器很好,因为当我在数据库中测试查询时,当类别和子类别为空时它就很好。同样,当我测试它时,我的 .xsd 文件中的表适配器的预览数据会很好地返回。
当我在浏览器中运行 .aspx 页面时出现问题。没有记录。起初我认为这是传递空值的问题,但是当我发现搜索参数在为空时作为空值传递时,我意识到它是专门针对类别和子类别的东西。然后我认为这可能是由于对整数使用了空值,所以我尝试将我的 SQL 查询更改为在 category = @category OR @category = 0 时工作,对于子类别也是如此。然后我将两者的 DefaultValue 都设置为 0,就像我为 state 所做的那样。这并没有解决问题,只是导致 ObjectDataSource 没有为这两个参数传递 0。
我的 ObjectDataSource 看起来像这样
<SelectParameters>
<asp:Parameter Name="search" Type="String" ConvertEmptyStringToNull="True" DefaultValue="" />
<asp:Parameter Name="category" Type="Int32" ConvertEmptyStringToNull="True" DefaultValue="" />
<asp:Parameter Name="subcategory" Type="Int32" ConvertEmptyStringToNull="True" DefaultValue="" />
<asp:Parameter Name="state" Type="Int32" DefaultValue="0" />
</SelectParameters>
</asp:ObjectDataSource>```
My BLL looks like so:
``` private PostsTableAdapters.GetPostsPagedTableAdapter _postsAdapter = null;
protected PostsTableAdapters.GetPostsPagedTableAdapter Adapter
{
get
{
if (_postsAdapter == null)
_postsAdapter = new PostsTableAdapters.GetPostsPagedTableAdapter();
return _postsAdapter;
}
}
[System.ComponentModel.DataObjectMethodAttribute(
System.ComponentModel.DataObjectMethodType.Select, false)]
public Posts.GetPostsPagedDataTable GetPostsPaged(int startRowIndex, int maximumRows, string search, int category, int subcategory, int state)
{
return Adapter.GetPostsPaged(startRowIndex, maximumRows, search, category, subcategory, state);
}
public int GetPostsCount(string search, int category, int subcategory, int state)
{
return (int)Adapter.GetPostsCount(search, category, subcategory, state);
}
[System.ComponentModel.DataObjectMethodAttribute(
System.ComponentModel.DataObjectMethodType.Select, false)]
public Posts.GetPostsPagedDataTable GetPostsActivePaged(int startRowIndex, int maximumRows)
{
return Adapter.GetPostsActivePaged(startRowIndex, maximumRows);
}
public int GetPostsActiveCount()
{
return (int)Adapter.GetPostsActiveCount();
}```
My stored procedure looks like so:
```ALTER PROCEDURE [dbo].[GetPostsPaged]
(
@startRowIndex int,
@maximumRows int,
@search nvarchar(max),
@category int,
@subcategory int,
@state int
)
AS
SELECT postid, posttitle, city, image, imagename, date, statename, stateslug, catname, catslug, scatname, scatslug
FROM
(
SELECT posts.postid, posts.posttitle, posts.city, posts.image, posts.imagename, posts.date, states.statename, states.stateslug, categories.catname, categories.catslug, subcategories.scatname, subcategories.scatslug,
ROW_NUMBER() OVER (ORDER BY posts.date DESC) AS RowRank
FROM posts INNER JOIN categories ON posts.category = categories.catid INNER JOIN states ON posts.state = states.stateid INNER JOIN subcategories ON posts.subcategory = subcategories.scatid
WHERE (posts.banned = 0) AND (posts.active = 1) AND (posts.posttitle LIKE '%' + @search + '%' OR posts.postbody LIKE '%' + @search + '%' OR posts.city LIKE '%' + @search + '%' OR posts.hashtag LIKE '%' + @search + '%' OR @search IS NULL) AND (posts.category = @category OR @category IS NULL) AND (posts.subcategory = @subcategory OR @subcategory IS NULL) AND (posts.state = @state OR @state = 0)
) AS PostsWithRowNumbers
WHERE RowRank > @startRowIndex AND RowRank <= (@startRowIndex + @maximumRows)
【问题讨论】:
标签: asp.net sql-server stored-procedures webforms objectdatasource