【问题标题】:How would I go about loading result sets from separate SQL Server Database queries into a GridView?我将如何将来自单独 SQL Server 数据库查询的结果集加载到 GridView 中?
【发布时间】:2016-11-15 16:12:01
【问题描述】:

我必须完成看似微不足道的任务,但事实证明它比我预期的更令人困惑。这是场景:

我有一个GridView,它从我的SQL Server 数据库中获取数据并将其显示在网页上(非常正常的场景)。但是,我有一些过滤器可以确定在数据库上运行哪个查询,这显然决定了最终显示在GridView 中的数据。我在有效地合并这些过滤器时遇到了一些麻烦。目前,我有这三个子程序:LoadPendingRequests()LoadApprovedRequests()LoadDeniedRequests()。如您所料,我有一个CheckboxList,它允许用户选择“待定”、“已批准”或“已拒绝”,并且根据所选择的,调用相应的子例程,从而填充GridView与相应的数据。这部分有效。

但是,用户可以选择同时加载挂起、拒绝和批准请求的任意组合。这就是我遇到麻烦的地方。这是CheckboxListSelectedIndexChanged 事件处理程序:

Protected Sub CheckboxList1_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles CheckboxList1.SelectedIndexChanged

        If CheckboxList1.SelectedIndex < 0 Then
            CheckboxList1.SelectedIndex = 0
        End If


        If CheckboxList1.Items(0).Selected = True Then 'pending checkbox
            LoadPendingRequests()
        End If
        If CheckboxList1.Items(1).Selected = True Then 'approved checkbox
            LoadApprovedRequests()
        End If
        If CheckboxList1.Items(2).Selected = True Then 'denied checkbox
            LoadDeniedRequests()
        End If
    End Sub

这里是加载请求的子程序示例(它们都是一样的,只是替换“where”子句中的过滤词):

Protected Sub LoadPendingRequests()
            Try
                Dim DbConnection As New DevConnection()
                Dim Da As New SqlDataAdapter()

                Using DbConnection.Conn
                    DbConnection.Conn.Open()
                    Using SqlCmd As New SqlCommand()
                        With SqlCmd
                            .Connection = DbConnection.Conn
                            .CommandType = CommandType.Text
                            .CommandText = "SELECT * FROM dbo.reqTable where Status = 'Pending'"
                        End With
                        Using Da
                            Da.SelectCommand = SqlCmd
                            Using Dt As New DataTable()
                                Da.Fill(Dt) 'populates the dataset
                                Gv.DataSource = Dt
                                'Gv.DataBind()

                                CheckSuggestionApprovalStatus()
                            End Using
                        End Using
                    End Using
                End Using
            Catch ex As Exception

            End Try

    End Sub

在这种设置下,当用户单击CheckboxList 中的框时,我将如何加载待处理、已批准和已拒绝的请求?如有必要,我愿意完全改变这个过程。

【问题讨论】:

  • 解决这个问题的最简单方法(尽管可能被纯粹主义者不赞成)是只使用一个查询,其中 WHERE 子句根据选中的框动态构建。
  • @peterG 感谢您的回复。我也想过这样做。我想看看是否有人对替代方法有任何想法,但我最终可能会这样做。
  • 更好的选择是创建一个将状态作为参数接收的存储过程。

标签: asp.net sql-server vb.net gridview webforms


【解决方案1】:

这是此类事物的存储过程的外观。

create procedure Requests_GetByStatus
(
    @Status varchar(10)
) as
    set nocount on;

    select *
    from dbo.reqTable
    where Status = @Status

我会敦促您不要将状态作为文本存储在每一行中。相反,我将有一个 RequestStatus 表来保存文本值和一个 int (可能是一个身份)并将该值存储在您的 Request 表中。当然也不要真正使用select *,你应该指定你真正需要的列。

--编辑--

这是您可以传入三个参数并在单个查询中获取任何组中的数据的一种方式。我已经显着扩展了 where 谓词,以便您可以轻松查看正在发生的事情。

create procedure Requests_GetByStatus
(
    @Pending bit = null
    , @Approved bit = null
    , @Denied bit = null
) as
    set nocount on;

    select *
    from dbo.reqTable
    where 
    (
        (
            Status = 'Pending' 
            AND
            @Pending = 1
        )
    )
    OR
    (
        (
            Status = 'Approved'
            AND
            @Approved = 1
        )
    )
    OR
    (
        (
            Status = 'Denied'
            AND
            @Denied = 1
        )
    )

【讨论】:

  • 我喜欢这种方法。谢谢你的建议。我现在正在尝试。出于好奇,为什么要将状态存储在单独的表中而不是当前方法中?我有兴趣知道。我不是一个真正的数据库人。
  • 好吧,假设企业决定不再希望状态为“拒绝”。相反,他们想将其命名为“拒绝”。如果将描述存储在每一行中,则必须更新每一行。如果它是一个单独的表,则更新查找表中的那一行。一遍又一遍地存储文本并没有很好地规范化。考虑一下您是否有三个要插入该表的位置,并且它们都必须拼写相同。然后你会发现一个拼写错误……呃。
  • 啊,我明白了。这就说得通了。这种方法如何帮助我同时加载具有不同状态的请求?我确定我只是错过了一些东西。
  • 啊,您希望能够加载它们的任意组合,是吗?这需要对逻辑稍作修改。我会发布更新。
  • 谢谢!不过,我确实喜欢你的想法。我将使用存储过程在服务器端编写一个函数,而不是三个。我不知道为什么我没有想到...
猜你喜欢
  • 2018-07-25
  • 2012-07-28
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 2019-02-01
相关资源
最近更新 更多