首页 > 代码库 > C# 如何通过拼接XML调用存储过程来查询数据

C# 如何通过拼接XML调用存储过程来查询数据

   每查询数据,需要访问一次数据库,这样会影响性能;如果把查询的数据拼接成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="&gt;">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        

 

C# 如何通过拼接XML调用存储过程来查询数据