【问题标题】:Creating a select query based on selected checkboxes in asp.net in stored procedure在存储过程中基于 asp.net 中的选定复选框创建选择查询
【发布时间】:2012-10-03 05:08:23
【问题描述】:

我在数据库中有两个名为 Customer 和 orders 的表。在我的 ASP.NET 页面中,我有代表这两个表中的字段的复选框。

用户可以从复选框中进行选择(名字,订单名是强制性的)。根据选中的复选框,我需要生成一个 sql 查询。当用户按下提交按钮时,查询将返回带有从 CustomerType 下拉列表中应用的过滤器的结果。

为此,我检查了是否在我的代码中选中了该复选框,并在我的存储过程中将其作为位类型传递。我的存储过程是,

CREATE PROCEDURE [dbo].[GetCustomerDetails]     
@LastName BIT,
@Phone BIT,
@Email BIT,
@Quantity BIT,
@OrderedDate BIT,
@ReturnPolicy BIT,
@CustomerType nvarchar(40)  

作为 开始 设置无计数 德尔卡 @Sql NVARCHAR(4000)

SET @Sql='SELECT c.FirstName,o.OrderItemName'
IF @LastName =1
    BEGIN
        SET @Sql=@sql+'c.LastName,'
    END 
IF @Phone =1
    BEGIN
         SET @Sql=@sql+'c.Phone,'
    END 
IF @Email =1
    BEGIN
        SET @Sql=@sql+'c.Email,'
    END
IF @Quantity =1
    BEGIN
        SET @Sql=@sql+'o.Quantity,'
    END 
IF @OrderDate =1
    BEGIN
        SET @Sql=@sql+'o.OrderDate,'
    END 
IF @ReturnPolicy =1
    BEGIN
        SET @Sql=@sql+'o.ReturnPolicy'
    END

SET @sql=@sql +' ' +'from Customer c inner join Order o on c.CustomerId=o.CustomerID where c.CustomerType =' + '@CustomerType'

EXEC(@sql)

结束

现在,在 asp.net 页面的复选框中添加了许多额外的表格列(30 列)。这只是添加了太多位类型变量和 if 条件来检查这些位类型变量并根据存储过程中的那些位类型变量将其连接到 @sql。有没有更好的方法来实现这一点?请提出建议。

【问题讨论】:

  • 在这种情况下为什么不编写内联查询.. 您可以遍历复选框列表并在 for 循环本身中创建查询
  • 既然你没有在 where 子句中使用那些选中的字段,为什么你不从数据库中选择所有列并且只显示那些匹配选中的字段?
  • @codingbiz,我也想到了你的方法。在上面的示例中,我只显示了一个过滤器下拉列表(条件),但我的实际有 5 或 6 个。无论如何,您的想法似乎为我的问题提供了更快的解决方案。谢谢。

标签: asp.net sql sql-server-2008


【解决方案1】:

首先创建一个表,我们称它为具有 3 列的过滤器,如下所示:

1. filter varchar(100)
2. inputBit bit
3. condition (this can be any condition, may be date time or any incremental int)

现在插入您的过滤条件以及所有列的输入位:如下所示:

c.LastName  1 11
c.Phone 1 11
c.Email 1 11
o.Quantity  1 11
o.OrderDate 1 11
o.ReturnPolicy  1 11

在上面的例子中,我认为条件是 int,它的值对于一个特定的实例是 11,对于下一个实例它可以是别的东西。

现在使用以下查询:

DECLARE @Sql NVARCHAR(4000)
declare @var1 varchar(100)
declare @var2 bit
SET @Sql='SELECT c.FirstName,o.OrderItemName'
declare cur_filtered_view cursor for
select filter,inputBit from filters where condition = 11
open cur_filtered_view
fetch next from cur_filtered_view into @var1,@var2
while @@fetch_status = 0
begin
if(@var2 = 1)
begin
    set @Sql = @Sql+','+@var1
end
fetch next from cur_filtered_view into @var1,@var2
end
close cur_filtered_view
deallocate cur_filtered_view
set @Sql = @Sql + ' from Customer c inner join Order o on c.CustomerId=o.CustomerID where c.CustomerType =' + '@CustomerType' 
exec (@Sql)

现在,如果要添加任何新过滤器,则无论如何您都必须将其作为位从前端传递给 Proc。此后唯一需要的更新是在过滤器表中为这些新过滤器添加一行,并在每个 proc 调用中将相关值插入过滤器表中。

【讨论】:

  • 感谢老手。我也会试试你的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 2018-03-09
相关资源
最近更新 更多