CSharp 如何通过拼接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 = ;
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
CSharp 如何通过拼接XML调用存储过程来查询数据的更多相关文章
- C# 如何通过拼接XML调用存储过程来优化系统性能
平常新增多条记录,需要多次访问数据库,这样会影响性能:如果把新增的数据拼接成XML形式,作为参数传给存储过程来处理,这只访问数据库一次,执行速度会快很多. 1.C#代码如下:XML拼接的字段不能出现& ...
- Sql Server 存储过程中查询数据无法使用 Union(All)
原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...
- 调用存储过程取到数据通过NPOI存到Excel中
//调用 public ActionResult GenerateExcel() { DataTable headerTable = new DataTable(); ...
- SQL存储过程动态查询数据区间
以前经常看到人查询数据库采用left join及case方式,一条一条的枚举查询整个数据的数据区间方法可行,但是数据一但很大,枚举就死悄悄,在网上查看,几乎全是照抄case ,left join枚举无 ...
- Ibatis调用存储过程实现增删改以及分页查询
1.Ibatis实现增删改操作很简单了,通常我是将某一模块的增删改功能写在一个存储过程里,通过一个标识符去区分执行增加还是修改抑或删除操作. statement: <!-- 存储过程:实现学生的 ...
- 最通用的ibatis.Net使用sql server存储过程返回分页数据的详细例子
ibatis.Net是一个比较简单和灵活的ORM框架,今天我分享一个我的项目中使用sql server通用存储过程来分页的一个例子,用ibatis.Net框架统一返回分页数据为IList<Has ...
- Mybatis之基于XML的调用存储过程与手动回滚事务
一.调用存储过程 一.返回单个值 1.存储过程准备 这里先创建一个存储过程,传入参数为age,传出参数为count.然后先测试一下是否正确. CREATE DEFINER=`root`@`localh ...
- FineReport调用存储过程
"总结一下本人在项目中遇到的问题,如何在数据库表名未知且作为一种查询条件的情况下查询出数据集,仅能通过FineReport+Oracle实现. 首先分析这个问题的条件和要求: 条件:只有一个 ...
- myabatis oracle 调用存储过程返回list结果集
Mapper.xml 配置 <resultMap type="emp" id="empMap"> <id property="emp ...
随机推荐
- 6、SQL基础整理(日期时间数据类型,转换函数)
日期时间数据类型 *系统常量: @@DATEFIRST(返回当前时间) DATEADD 增加时间 语法:DATEADD (datepart , number , date ) select DATEA ...
- 联合与枚举 、 高级指针 、 C语言标准库(一)
1 输入一个整数,求春夏秋冬 1.1 问题 在实际应用中,有的变量只有几种可能取值.如人的性别只有两种可能取值,星期只有七种可能取值.在 C 语言中对这样取值比较特殊的变量可以定义为枚举类型.所谓枚举 ...
- phpcms v9中调用多栏目的方法--get标签(备实例)
如调用栏目id为1,2,7的栏目列表: {pc:get sql="select * from v9_category where catid IN (1,2,7)"} {loop ...
- dedecms内容页调用缩略图 缩略图多种用法(借鉴)
文章内容页调用缩略图方法如下两种.第一种没有大小设置.原图显示.第二种.可以设大小, (1) {dede:field.image/} (2)<img src="{dede:field. ...
- spark读hdfs文件实现wordcount并将结果存回hdfs
package iie.udps.example.operator.spark; import scala.Tuple2; import org.apache.spark.SparkConf; imp ...
- ARM异常中断处理
ARM异常中断处理 在ARM体系中,通常有以下3种方式控制程序的执行流程: 在正常程序执行过程中,每执行一条ARM指令,程序计数器寄存器(PC)的值加4个字节:每执行一条Thumb指令,程序计数器寄存 ...
- pstack使用和原理
前言: 最近小组在组织<<深入剖析Nginx>>的读书会, 里面作者提到了pstack这个工具. 之前写JAVA程序, 对jstack这个工具, 非常的喜欢, 觉得很有用. 于 ...
- webStorm快捷键总结
Ctrl+Shift+a:快速查找使用编辑器所有功能1.左侧栏目录显影:Ctrl+Shift+F122.文件模板配置:File>Settings>Editor>File and Co ...
- MATLAB符号运算 分类: 图像处理 2015-07-31 22:53 3人阅读 评论(0) 收藏
1.符号运算 使用MATLAB可以进行多项式乘除运算,也可以进行因式分解. 例1. 多项式乘除运算(x+3)3 >> syms x; >> expand((x+3)^3) an ...
- linux笔记_磁盘分区
一.分区的意义 1.不同操作系统往往不可以同时装载在同一个分区,分区解决了不同操作系统装载在同一个物理硬盘的兼容性问题 2.机械硬盘盘片外圈读写速度相对内圈要快,分区可以把常用数据限制在读写速度较快的 ...