码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-08-27 12:36:57      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   color   os   io   for   ar   数据   

   每查询数据,需要访问一次数据库,这样会影响性能;如果把查询的数据拼接成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调用存储过程来查询数据

标签:des   style   blog   color   os   io   for   ar   数据   

原文地址:http://www.cnblogs.com/allenhua/p/3939056.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!