【问题标题】:ObjectDataSource Not Passing DefaultValue to Table AdapterObjectDataSource 未将 DefaultValue 传递给表适配器
【发布时间】: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


    【解决方案1】:

    如果您将参数更改为可空类型怎么办?我认为 Int32 不适用于 null。试试 Nullable 还是“Int32”?也许吧?

    【讨论】:

      【解决方案2】:

      我最终不得不在 GetPostsPaged 和 GetPostsPagedCount 查询中将空整数更改为 0,并将默认值设置为 0。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多