2016-11-15 33 views
0

我必须完成一项看起来很不重要的任务,但事实证明这比我预料的要困难得多。这里是场景:我将如何去从单独的SQL Server数据库查询加载结果集到GridView?

我有一个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中的方框时同时加载未决,已批准和拒绝的请求?如有必要,我愿意完全改变这一过程。

+0

最简单的方法来解决这个问题(尽管纯粹主义者可能会皱起眉头)是只有一个查询,其中WHERE子句是根据检查框而动态构建的。 – peterG

+0

@peterG感谢您的回复。我也想这样做。我想看看有没有人有其他方法的想法,但我最终可能会这样做。 – ic3man7019

+0

更好的选择是创建一个接收状态作为参数的存储过程。 –

回答

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 
     ) 
    ) 
+0

我喜欢这种方法。感谢您的建议。我现在正在尝试。出于好奇,为什么要将状态存储在单独的表中而不是当前的方法?我很想知道。我不是一个真正的数据库家伙。 – ic3man7019

+2

那么假设企业决定他们不再希望地位被“拒绝”。相反,他们想将其命名为“拒绝”。如果您将说明存储在每一行中,则必须更新每一行。如果它是一个单独的表,则更新查找表中的那一行。一遍又一遍地存储文本没有很好地标准化。考虑如果你有三个位置插入表中,他们都必须拼写相同。然后你发现一个拼写错误的...呃。 –

+0

啊,我明白了。这就说得通了。这种方法如何帮助我同时加载具有不同状态的请求?我相信我只是错过了一些东西。 – ic3man7019

相关问题