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

CSharp 如何通过拼接XML调用存储过程来查询数据的更多相关文章

  1. C# 如何通过拼接XML调用存储过程来优化系统性能

    平常新增多条记录,需要多次访问数据库,这样会影响性能:如果把新增的数据拼接成XML形式,作为参数传给存储过程来处理,这只访问数据库一次,执行速度会快很多. 1.C#代码如下:XML拼接的字段不能出现& ...

  2. Sql Server 存储过程中查询数据无法使用 Union(All)

    原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...

  3. 调用存储过程取到数据通过NPOI存到Excel中

        //调用  public ActionResult GenerateExcel() {             DataTable headerTable = new DataTable(); ...

  4. SQL存储过程动态查询数据区间

    以前经常看到人查询数据库采用left join及case方式,一条一条的枚举查询整个数据的数据区间方法可行,但是数据一但很大,枚举就死悄悄,在网上查看,几乎全是照抄case ,left join枚举无 ...

  5. Ibatis调用存储过程实现增删改以及分页查询

    1.Ibatis实现增删改操作很简单了,通常我是将某一模块的增删改功能写在一个存储过程里,通过一个标识符去区分执行增加还是修改抑或删除操作. statement: <!-- 存储过程:实现学生的 ...

  6. 最通用的ibatis.Net使用sql server存储过程返回分页数据的详细例子

    ibatis.Net是一个比较简单和灵活的ORM框架,今天我分享一个我的项目中使用sql server通用存储过程来分页的一个例子,用ibatis.Net框架统一返回分页数据为IList<Has ...

  7. Mybatis之基于XML的调用存储过程与手动回滚事务

    一.调用存储过程 一.返回单个值 1.存储过程准备 这里先创建一个存储过程,传入参数为age,传出参数为count.然后先测试一下是否正确. CREATE DEFINER=`root`@`localh ...

  8. FineReport调用存储过程

    "总结一下本人在项目中遇到的问题,如何在数据库表名未知且作为一种查询条件的情况下查询出数据集,仅能通过FineReport+Oracle实现. 首先分析这个问题的条件和要求: 条件:只有一个 ...

  9. myabatis oracle 调用存储过程返回list结果集

    Mapper.xml 配置 <resultMap type="emp" id="empMap"> <id property="emp ...

随机推荐

  1. (Your)((Term)((Project)))

    Description You have typed the report of your term project in your personal computer. There are seve ...

  2. Android 中如何获取 H5 保存在 LocalStorage 的数据

    主要分三步: 写个接口,接收 Js 回调 添加到 WebView 主动调用 Js 获取 比如我要获取保存在 LocalStorage 中的 userKey 字段: 1.写个接口,接收 Js 回调 pu ...

  3. SQL技巧

    数据查询    且不说你是否正在从事编程方面的工作或者不打算学习SQL,可事实上几乎每一位开发者最终都会遭遇它.你多半还用不着负责创建和维持某个数据库,但你怎么着也该知道以下的一些有关的SQL知识.我 ...

  4. Tranparent/cutout/diffuse

    Shader "Tranparent/cutout/diffuse" { Properties {   //  _Color ("Main Color", Co ...

  5. 归档 Archive、解档Unchive、 XML(一)

    1 使用归档的方式保存文件 1.1 问题 归档是任何对象都可以实现的更常规的方式,可以进行归档的对象需要实现NSCoding协议,而且每个实例变量应该是基本数据类型或者是实现NSCoding协议的某个 ...

  6. The Implementation of Lua 5.0 阅读笔记(一)

    没想到Lua的作者理论水平这么高,这篇文章读的我顿生高屋建瓴之感.云风分享了一篇中译:http://www.codingnow.com/2000/download/The%20Implementati ...

  7. archlinux设置无线网络连接

    Check the driver $ lspci -k Open the network card $ ip link set <设备名> up Check device status $ ...

  8. box2dweb 学习笔记--sample讲解

    前言: 之前博文"台球游戏的核心算法和AI(1)" 中, 提到过想用HTML5+Box2d来编写实现一个台球游戏. 以此来对比感慨一下游戏物理引擎的巨大威力. 做为H5+box2d ...

  9. 装载:关于拉格朗日乘子法与KKT条件

    作者:@wzyer 拉格朗日乘子法无疑是最优化理论中最重要的一个方法.但是现在网上并没有很好的完整介绍整个方法的文章.我这里尝试详细介绍一下这方面的有关问题,插入自己的一些理解,希望能够对大家有帮助. ...

  10. VGA DVI HDMI区别

    VGA,DVI,HDMI是目前常用的3种不同显示接口的名称.在树莓派的边缘既有HDMI的接口,也有RCA的接口,而显示器上也是既有DVI,又有VGA.上个月买连接线,没有仔细检查买了一根HDMI对VG ...