每查询数据,需要访问一次数据库,这样会影响性能;如果把查询的数据拼接成XML形式,作为一个参数整体传给存储过程来处理,这只访问数据库一次,执行速度会快很多。
1.C#代码如下:
/// <summary> /// 查询订单信息 /// </summary> /// <param name="WhereXML">查询条件XML格式</param> /// <param name="OrderBy">排序字段</param> /// <param name="PageIndex">当前页数</param> /// <param name="PageSize">每页条数</param> /// <param name="RecordCount">总记录数</param> /// <returns></returns> public List<OrderTO> SearchOrder(string WhereXML, string OrderBy, int PageIndex, int PageSize, out int RecordCount) { List<OrderTO> list = new List<OrderTO>(); try { Query qu = new Query(); qu.Procedure = "[dbo].[mp_Order_List]"; Query.ParameterItem item = new Query.ParameterItem(); item.Type = SqlDbType.Xml; item.Value = WhereXML; qu.Parameters.Add("Where", item); // item = new Query.ParameterItem(); item.Type = SqlDbType.NVarChar; item.Value = OrderBy; qu.Parameters.Add("OrderBy", item); // item = new Query.ParameterItem(); item.Type = SqlDbType.Int; item.Value = PageIndex.ToString(); qu.Parameters.Add("PageIndex", item); // item = new Query.ParameterItem(); item.Type = SqlDbType.Int; item.Value = PageSize.ToString(); qu.Parameters.Add("PageSize", item); // item = new Query.ParameterItem(); item.Direction = ParameterDirection.Output; qu.Parameters.Add("RecordCount", item); list = ExecuteProcAndGetOutput(qu, out RecordCount); return list; } catch (Exception ex) { RecordCount = 0; ErrorLog.Write("SearchOrder【订单跟踪查询】", ex); return null; } }
2.SQL脚本:
create procedure [dbo].[mp_Order_List_Test] ( @Where xml --条件 ,@OrderBy varchar(100) --排序字段 ,@PageIndex int --页码 ,@PageSize int --每页显示行数 ,@RecordCount int output --记录数 ) as /********************************************************** ** Purpose : 订单跟踪查询 ** ** Date Author Version Revision ** ----- -------- ---------- --- ** 2014/7/29 Ham Tan 1.0 **********************************************************/ begin declare @sql nvarchar(max) ,@OrderByStr nvarchar(1024) = '' ,@whereStr nvarchar(1024) = '' ,@params nvarchar(1024) = '' declare @Code nvarchar(50) ,@SourceCode nvarchar(50) ,@SourcePlate varchar(10) ,@PayTimeForm varchar(10) ,@PayTimeTo varchar(10) ,@OrderNum varchar(10) ,@OrderNumOpType varchar(20) /* <Query> <Code>SO140820-1</Code> <SourceCode>SO140820-1</SourceCode> <SourcePlate>1</SourcePlate> <OrderNum OpType=">">1</OrderNum> <PayTime From="2014-08-20" To="2014-08-20"></PayTime> </Query> */ --准备查询条件 select @Code = R.c.value('(Code)[1]','nvarchar(50)') --编号 ,@SourceCode = R.c.value('(SourceCode)[1]','nvarchar(50)') --来源单号 ,@SourcePlate = R.c.value('(SourcePlate)[1]','varchar(10)') --来源平台 ,@PayTimeForm = R.c.value('(./PayTime/@From)[1]','varchar(10)') --付款开始时间 ,@PayTimeTo = R.c.value('(./PayTime/@To)[1]','varchar(10)') --付款结束时间 ,@OrderNum = R.c.value('(OrderNum)[1]','varchar(10)') --数量 ,@OrderNumOpType = R.c.value('(./OrderNum/@OpType)[1]','varchar(20)') --数量查询符 from @Where.nodes('/Query') R(c) print @Code; --@Code if(@Code <> '') begin set @Code = @Code +'%' set @whereStr = @whereStr + ' and A.code like @code ' end if(@SourceCode <> '') begin set @SourceCode = @SourceCode +'%' set @whereStr = @whereStr + ' and A.SourceCode Like @SourceCode ' end if(@SourcePlate <> '') begin set @whereStr = @whereStr + ' and A.SourcePlate = @SourcePlate ' end if(@OrderNum <> '') begin set @whereStr = @whereStr + ' And A.OrderNum ' + @OrderNumOpType+ ' @OrderNum ' end if(@PayTimeForm <> '') begin set @whereStr = @whereStr + ' And A.PayTime >= @PayTimeForm ' end print @PayTimeTo if(@PayTimeTo <> '') begin set @PayTimeTo = CONVERT(varchar(10),CONVERT(datetime,@PayTimeTo) + 1,120) set @whereStr = @whereStr + ' And A.Paytime < @PayTimeTo ' end if CHARINDEX('Code',@OrderBy) = 1 begin set @OrderByStr = 'A.' + @OrderBy end else if CHARINDEX('Paytime',@OrderBy) = 1 begin set @OrderByStr = REPLACE(@OrderBy,'PayTime','A.PayTime') end else begin set @OrderByStr = @OrderBy end create table #torderList( RowId int primary key, Id int not null, Code nvarchar(50) null, SourceCode nvarchar(50) null, SourcePlate int null, OrderNum int null, PayTime datetime null ) --@sql需要和#torderList一一对应 set @sql = ' select ROW_NUMBER() over(order by '+ @OrderByStr +') ,A.Id ,A.Code ,A.SourceCode ,A.SourcePlate ,A.OrderNum ,A.PayTime from [order] A With(nolock) where 1 = 1' + @whereStr print @sql; set @params ='@Code nvarchar(50),@SourceCode nvarchar(50),@SourcePlate int,@PayTimeForm datetime,@PayTimeTo datetime,@OrderNum int' insert into #torderList( [RowId] ,Id ,Code ,SourceCode ,SourcePlate ,OrderNum ,PayTime ) exec sp_executesql @sql, @params,@Code,@SourceCode,@SourcePlate,@PayTimeForm,@PayTimeTo,@OrderNum set @RecordCount = @@ROWCOUNT; select * from #torderList where [RowId] > (@PageIndex - 1) * @PageSize and [RowId] <= @PageIndex * @PageSize order by [RowId]; Drop Table #torderList; end