你好朋友我正在为我的项目遵循3层架构我的意思 表示层,业务逻辑层,最后是数据库层 我的问题是我正在为我的项目制作搜索功能,我需要通过搜索查询的方法发送参数,该方法将在业务逻辑层上进行 我是通过调用一些方法从表示层发送参数,这些参数将用于业务逻辑层的方法来进行适当的查询 我不确定每次参数是可选的时候会发送多少参数 所以我的问题是我应该如何发送这些可选参数以准确获取业务逻辑层上的require参数。
最好的方法是什么,我在asp.net编程
答案 0 :(得分:0)
如果您使用业务实体,请使用自定义属性标记每个属性(mask = 1,2,4,8 ...,required = true / false)。
class Product
{
[FieldAttribute(Required=true, Mask= 0)]
public int Id {get; set;}
...
[FieldAttribute(Required=false, Mask=1)]
public string ProductName { get; set;}
}
然后你可以使用反射来读取所有必需的属性并将它们传递给sp。如果某些不需要的参数为null(使用Nullable<>),则不增加掩码(mask& = propertyMask)。
使用整数掩码进行部分更新。
/*
exec dbo.Update_Product @product_id = 1, @quantity = 3, @mask = 0x0004
exec dbo.Update_Product @product_id = 1, @product_name = 'new name', @comment = 'new comment', @mask = 0x0003
*/
alter proc dbo.Update_Product
@product_id int
,@product_name nvarchar(100) = NULL -- 0x0001
,@comment nvarchar(255) = NULL -- 0x0002
,@quantity int = NULL -- 0x0004
,@mask int
AS
update dbo.Product
SET
ProductName = CASE WHEN (@mask & 0x0001) > 0 THEN @product_name ELSE ProductName END
,Comment = CASE WHEN (@mask & 0x0002) > 0 THEN @comment ELSE Comment END
,Quantity = CASE WHEN (@mask & 0x0004) > 0 THEN @quantity ELSE Quantity END
WHERE id = @product_id
2)对于select,请使用两个蒙版(select,and where)
/*
exec dbo.Select_Product @select_mask = 0x0001, @where_mask = 0
exec dbo.Select_Product @select_mask = 0x0003, @where_mask = 0
exec dbo.Select_Product @select_mask = 0x0003, @where_mask = 0x0004, @quantity = 2
*/
alter proc dbo.Select_Product
@select_mask int
,@where_mask int
,@product_name nvarchar(100) = NULL -- 0x0001
,@comment nvarchar(255) = NULL -- 0x0002
,@quantity int = NULL -- 0x0004
as
DECLARE @select varchar(max)
DECLARE @where varchar(max)
SET @select = 'select Id '
IF (@select_mask & 0x0001) > 0
SET @select = @select + ',ProductName'
IF (@select_mask & 0x0002) > 0
SET @select = @select + ',Comment'
IF (@select_mask & 0x0004) > 0
SET @select = @select + ',Quantity'
SET @select = @select + ' from dbo.Product'
IF @where_mask > 0
SET @where = ' where ' + CASE WHEN (@where_mask & 0x0001) > 0 THEN 'ProductName = ''' + @product_name + '''' ELSE '' END
+ CASE WHEN (@where_mask & 0x0002) > 0 THEN 'Comment = ''' + @comment + '''' ELSE '' END
+ CASE WHEN (@where_mask & 0x0004) > 0 THEN 'Quantity = ' + CONVERT(varchar(10), @quantity) ELSE '' END
PRINT @select + @where
exec (@select + @where)