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 ...
随机推荐
- 第二个Sprint冲刺第二天
讨论地点:宿舍 讨论成员:邵家文.李新.朱浩龙.陈俊金 任务:解决了第二个Sprint冲刺第一天遇到的错误. 燃尽图: 遇到的问题: 解决之后: 开发感悟:最近一直在写代码,都很少外出活动了,不知不觉 ...
- Linux发展史
简述 Linux是一套自由加开放源代码的类Unix操作系统,诞生于1991年10月5日(第一次正式向外公布),由芬兰学生Linus Torvalds和后来陆续加入的众多爱好者共同开发完成. Linux ...
- How to use HaploView
HaploView is a program that is used to visualize the LD blocks of SNPs. What I need to do is the fo ...
- poi 合并单元格 无边框问题
public void merge(int startrow,int endstartrow,int startColumn,int endColumn){ sht.addMergedRegion(n ...
- ZOJ1238 Guess the Number
/*In this problems, we’ll talk about BIG numbers. Yes, I’m sorry, big numbers again…. Let N be a pos ...
- indexOf()的用法
indexOf()的用法:返回字符中indexof(string)中字串string在父串中首次出现的位置,从0开始!没有返回-1:方便判断和截取字符串! indexOf()定义和用法indexOf( ...
- smartUpload组件单文件下载
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, ...
- 《jave程序设计》第一周学习总结
<JAVA程序设计>第一周学习总结 教材学习内容总结 在第一周的学习中,我初次认识了JAVA程序的一些基础知识.我发现了很多问题 问题就是自己的代码编写出现了一点问题,符号和单词的大小写都 ...
- 【转】 iOS 开发之静态库.a和动态库详解 -- 不错
原文网址:http://blog.csdn.net/lxl_815520/article/details/52154331 一, 简单介绍 1.什么是库 库是程序代码的集合,是共享程序代码的一种方式 ...
- 论文笔记之:Instance-aware Semantic Segmentation via Multi-task Network Cascades
Instance-aware Semantic Segmentation via Multi-task Network Cascades Jifeng Dai Kaiming He Jian Sun ...