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 ...
随机推荐
- HDU 5820 (可持久化线段树)
Problem Lights (HDU 5820) 题目大意 在一个大小为50000*50000的矩形中,有n个路灯.(n<=500000) 询问是否每一对路灯之间存在一条道路,使得长度为|x1 ...
- 在Web.config中注册自定义控件
之前都是在每个页面的顶端注册用户控件或者是自定义控件,这样不简洁,而且麻烦. 现在只要在在web.config文件中声明,其他地方就可以直接使用前缀加控件如下黄色代码所示: <configura ...
- How to migrate from VMware and Hyper-V to OpenStack
Introduction I migrated >120 VMware virtual machines (Linux and Windows) from VMware ESXi to Open ...
- Core Java Volume I — 4.7. Packages
4.7. PackagesJava allows you to group classes in a collection called a package. Packages are conveni ...
- 【转】eclipse 安装插件
eclipse安装插件或许没有什么多的可讲,但对于刚刚接触eclipse这款IDE的新手来说,可能还是会有点棘手! eclipse安装插件大致三种方法: 方法一:自身安装器 使用eclipse的Sof ...
- 七 JavaBean
一 什么是 JavaBean? JavaBean 是一个遵循特定写法的Java类,它是基于 Java 的组件模型,由属性.方法和事件3部分组成. 二 JavaBean 的特点: 1. 这个Java类必 ...
- android布局中的divider(目前只知道TableLayout)
目前在genymotion中设置了之后显示不出来行与行之间的分割线,但是在真机上面是没有问题的 1.使用xml属性添加(3.0以上版本) 设置LinearLayout标签的 android:showD ...
- 开机流程与主引导分区(MBR)——鸟哥私房菜
在前篇随笔中,已经谈到了CMOS与BIOS,CMOS是记录各项硬件参数(包括系统时间.设备的I/O地址.CPU的电压和频率等)且嵌入到主板上面的存储器,BIOS是一个写入到主板上的韧体(韧体是写入到硬 ...
- matlab 已知函数值纵坐标值(Y值)获得对应的横坐标
clear all;clc; x=-pi/2:pi/50:pi; y=sin(x); plot(x,y); grid on; fm=max(y) id=find(y==fm); xm=x(id) 转自 ...
- C++ Primer : 第十二章 : 动态内存之unique_ptr和weak_ptr
unique_ptr 一个unique_ptr拥有它所管理的对象,与shared_ptr不同,unique_ptr指向的对象只能有一个用户.当unique_ptr被销毁后,它所指向的对象也被销毁. 定 ...