C# 如何通过拼接XML调用存储过程来优化系统性能
平常新增多条记录,需要多次访问数据库,这样会影响性能;如果把新增的数据拼接成XML形式,作为参数传给存储过程来处理,这只访问数据库一次,执行速度会快很多。
1.C#代码如下:XML拼接的字段不能出现&等其他执行存储过程不支持的符号,需要转义,C#里面的方法是 1.Server.HtmlEncode(参数值);2. ReplaceXmlStr(参数值);
/// <summary>
/// XML特殊字符替换
/// </summary>
/// <param name="str"></param>
public static string ReplaceXmlStr(string str)
{
if (!string.IsNullOrEmpty(str))
{
str = str.Replace("'", " "); //20140420 add
str = str.Replace("<", "<");
str = str.Replace(">", ">");
str = str.Replace("&", "&");
str = str.Replace("'", "'");
str = str.Replace("\"", """);
}
return str;
}
另外注意:
foreach循环不要这样写: MovementItemWmsInfoToXM = string.Format(MovementItemWmsInfoToXML, item.SkuCode, item.MovenmentCode, item.Effect,
item.Skunum, item.PropertityStock, item.PromotionCode.Replace("&", "%"), item.StockoutCount, item.StockSerialNumber,
!string.IsNullOrEmpty(item.UnitPrice) ? double.Parse(item.UnitPrice).ToString("0.00") : "0"
,item.ShipperId)
strBuilder.AppendLine(MovementItemWmsInfoToXM);
应该这样写: strBuilder.AppendFormat(MovementItemWmsInfoToXML, item.SkuCode, item.MovenmentCode, item.Effect,
item.Skunum, item.PropertityStock, item.PromotionCode.Replace("&", "%"), item.StockoutCount, item.StockSerialNumber,
!string.IsNullOrEmpty(item.UnitPrice) ? double.Parse(item.UnitPrice).ToString("0.00") : "0"
,item.ShipperId); 或strBuilder.Append(string.Format(MovementItemWmsInfoToXML, item.SkuCode, item.MovenmentCode, item.Effect,item.Skunum, item.PropertityStock, item.PromotionCode.Replace("&", "%"), item.StockoutCount, item.StockSerialNumber,!string.IsNullOrEmpty(item.UnitPrice) ? double.Parse(item.UnitPrice).ToString("0.00") : "0",item.ShipperId));
//拼接XML
private static string MovementItemWmsInfoToXML = "<MovementItemWmsInfoTO SkuCode=\"{0}\" MovenmentCode=\"{1}\" Effect=\"{2}\" Skunum=\"{3}\" PropertityStock=\"{4}\" " +
"PromotionCode=\"{5}\" StockoutCount=\"{6}\" StockSerialNumber=\"{7}\" UnitPrice=\"{8}\" ShipperId=\"{9}\"/>"; /// <summary>
/// 调用存储过程插入MovementItemWmsInfo信息
/// </summary>
/// <param name="list"></param>
/// <returns></returns>
public int InsertMovementItemWmsInfoByListstring(List<MovementItemWmsInfoTO> list)
{
int result = ;
try
{
if (list != null && list.Count > )
{
StringBuilder strBuilder = new StringBuilder();
foreach (MovementItemWmsInfoTO item in list)
{
strBuilder.AppendLine(string.Format(MovementItemWmsInfoToXML, item.SkuCode, item.MovenmentCode, item.Effect,
item.Skunum, item.PropertityStock, item.PromotionCode.Replace("&", "%"), item.StockoutCount, item.StockSerialNumber,
!string.IsNullOrEmpty(item.UnitPrice) ? double.Parse(item.UnitPrice).ToString("0.00") : ""
,item.ShipperId));
} List<SqlParameter> param = new List<SqlParameter>();
param.Add(new SqlParameter("@MovementItemWmsInfoToXML", strBuilder.ToString())); result = Convert.ToInt32(SqlHelper.ExecuteScalar(SqlHelper.connectionString, CommandType.StoredProcedure, "Proc_InsertMovementItemWmsInfo", param.ToArray()));
LogInfo.GetErrorInfoByExcetion("[移库单拆分]添加总数:“" + list.Count + "”,执行成功数“" + result + "”。\r\n SQL语句:" + strBuilder.ToString());
}
return result;
}
catch (Exception ee)
{
LogInfo.GetErrorInfoByExcetion("异常信息:"+ee.Message);
return result;
}
}
2.SQL脚本:
--====================================================
-- Author:Hamilton Tan
-- Create Date:2014-07-22
-- Description:插入MovementItemWmsInfo信息
--====================================================
CREATE PROCEDURE [dbo].[Proc_InsertMovementItemWmsInfo]
@MovementItemWmsInfoToXML XML
AS
BEGIN
DECLARE @ERROR INT SET @ERROR = 0;
DECLARE @rows INT;
DECLARE @index INT SET @index=1;
DECLARE @StockSerialNumber INT;
DECLARE @SkuCode NVARCHAR(200);
DECLARE @Effect VARCHAR(500);
DECLARE @PropertityStock INT;
DECLARE @UnitPrice numeric(18,2);
DECLARE @shipperid INT;
DECLARE @Tb_MovementItem TABLE
(
[ID] int IDENTITY(1,1),
[SkuCode] [nvarchar](200) NULL,
[MovenmentCode] [nvarchar](200) NULL,
[Effect] [varchar](500) NULL,
[Skunum] [int] NULL,
[PropertityStock] [int] NULL,
[PromotionCode] [nvarchar](200) NULL,
[StockoutCount] [int] NULL,
[StockSerialNumber] [int] NULL,
[UnitPrice] [numeric](18, 3) NULL,
[ShipperId] [int] NULL
);
--解析移库单MovementItemWmsInfo的XML信息
IF @MovementItemWmsInfoTOXML IS NOT NULL
BEGIN
BEGIN TRY
INSERT @Tb_MovementItem
SELECT
R.c.value('@SkuCode','nvarchar(200)'),
R.c.value('@MovenmentCode','nvarchar(200)'),
R.c.value('@Effect','varchar(500)'),
R.c.value('@Skunum','int'),
R.c.value('@PropertityStock','int'),
R.c.value('@PromotionCode','nvarchar(200)'),
R.c.value('@StockoutCount','int'),
R.c.value('@StockSerialNumber','int'),
R.c.value('@UnitPrice','numeric(18,2)'),
R.c.value('@ShipperId','int')
FROM @MovementItemWmsInfoTOXML.nodes('MovementItemWmsInfoTO') R(c) --R为行(Row),c为列(Column),
/*
也可以这样写
SELECT
Y.x.value('@SkuCode','nvarchar(200)'),
Y.x.value('@MovenmentCode','nvarchar(200)'),
Y.x.value('@Effect','varchar(500)'),
Y.x.value('@Skunum','int'),
Y.x.value('@PropertityStock','int'),
Y.x.value('@PromotionCode','nvarchar(200)'),
Y.x.value('@StockoutCount','int'),
Y.x.value('@StockSerialNumber','int'),
Y.x.value('@UnitPrice','numeric(18,2)'),
Y.x.value('@ShipperId','int')
FROM @MovementItemWmsInfoTOXML.nodes('MovementItemWmsInfoTO') Y(x) --R为行(Row),c为列(Column),
*/
/*
<Rows>
<Row Name="1" Value="">abcde</Row>
<Row Name="2" Value="">abcde</Row>
</Rows> SELECT
X.y.value('@Name','nvarchar(200)'), 为1
X.y.value('Row[1]','nvarchar(200)')为abcde
FROM @MovementItemWmsInfoTOXML.nodes('MovementItemWmsInfoTO') X(y)
*/ END TRY
BEGIN CATCH
SET @ERROR =-1;
END CATCH --获取总记录数
SELECT @rows = COUNT(1) FROM @Tb_MovementItem --循环处理
while(@rows>0)
begin
select @StockSerialNumber=StockSerialNumber,@SkuCode=SkuCode,@Effect=Effect
,@PropertityStock=PropertityStock,@UnitPrice= UnitPrice,@shipperid= ShipperId from @Tb_MovementItem where ID=@index -- 不能出现StockSerialNumber,SkuCode ,Effect,PropertityStock,UnitPrice,ShipperId相同的记录
IF NOT EXISTS (select 1 from MovementItemWmsInfo where StockSerialNumber=@StockSerialNumber and SkuCode = @SkuCode and Effect = @Effect
and PropertityStock = @PropertityStock and UnitPrice = @UnitPrice and ShipperId = @shipperid)
BEGIN
--插入数据
INSERT INTO [MovementItemWmsInfo]([SkuCode],[MovenmentCode],[Effect],[Skunum],[PropertityStock],[PromotionCode],[StockoutCount],[StockSerialNumber],[UnitPrice],[ShipperId])
SELECT [SkuCode],[MovenmentCode],[Effect],[Skunum],[PropertityStock],Replace([PromotionCode],'%','&'),[StockoutCount],[StockSerialNumber],[UnitPrice],[ShipperId] FROM @Tb_MovementItem
END
set @rows=@rows-1;
set @index=@index+1;
end
END select @Error; END
C# 如何通过拼接XML调用存储过程来优化系统性能的更多相关文章
- CSharp 如何通过拼接XML调用存储过程来查询数据
每查询数据,需要访问一次数据库,这样会影响性能:如果把查询的数据拼接成XML形式,作为一个参数整体传给存储过程来处理,这只访问数据库一次,执行速度会快很多. 1.C#代码如下: /// <sum ...
- 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 ...
- IBatis.Net使用总结(四)-- IBatis 调用存储过程
IBatis 调用存储过程 http://www.cnblogs.com/jeffwongishandsome/archive/2010/01/10/1543219.html http://www.c ...
- MyBatis学习总结(六)——调用存储过程(转载)
本文转载自:http://www.cnblogs.com/jpf-java/p/6013518.html 一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存 ...
- MyBatis入门学习教程-调用存储过程
一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 create table p_user( id int primary key auto_incr ...
- Java和Ibatis调用存储过程并取得返回值详解
Java和Ibatis调用存储过程并取得返回值详解 2011-07-19 17:33 jiandanfeng2 CSDN博客 字号:T | T 本文主要介绍了Java和Ibatis调用存储过程的方法, ...
- Spring JdbcTemplate 调用存储过程
遇到调用存储过程的业务,以前有用过,但不是用Spring的 JdbcTemplate去做的,这次是在一个已经有的SpringMVC框架的项目下写处理存储过程的. 参考网络中的方法,在实际操作中遇到两个 ...
随机推荐
- GCD时间轴
__block int timeout=60; //倒计时时间 dispatch_queue_t queue = dispatch_get_global_queue(DISPAT ...
- BZOJ3028 食物 (生成函数)
首先 1+x+x^2+x^3+...+x^∞=1/(1-x) 对于题目中的几种食物写出生成函数 (对于a*x^b , a表示方案数 x表示食物,b表示该种食物的个数) f(1)=1+x^2+x^4+. ...
- HDU 5047
http://acm.hdu.edu.cn/showproblem.php?pid=5047 直到看到题解,我才知道这道题考的是什么 首先交点数是Σ(16*i),区域区分的公式是 边数+点数+1=分成 ...
- Magento中如何调用SQL语句
I. 创建表结构和测试数据 create table rooms(id int not null auto_increment, name varchar(100), primary key(id)) ...
- php 数组 添加元素、删除元素
拆分数组 PHP数组添加一个元素的方式: push(), arr[], Php代码 $arr = array(); array_push($arr, el1, el2 ... eln); 但其实有一种 ...
- CSS知识点总结
1.选择器 参考链接:十分钟搞定CSS选择器-Samaritans CSS选择器笔记-阮一峰 CSS选择器-w3school MDN 参考书籍:<CSS高效开发指南> 2.布局 2. ...
- Java Super 覆盖方法
子类从父类中继承方法,有时候,子类需要修改父类中定义的方法的实现,这称作方法覆盖. 比如,GeometricObject类中的toString方法返回表示集合对象的字符串,这个方法就可以被覆盖,返回表 ...
- 总结 group by 的用法
今天用实例总结一下group by的用法. 归纳一下:group by:ALL ,Cube,RollUP,Compute,Compute by 创建数据脚本 Create Table SalesInf ...
- 最大连续子序列和问题(Maximum Consecutive Subsequence Sum)
该算法的定义是:给出一个int序列,元素有正有负,找出其中的最大连续子序列的和. 例如:-2,11,-4,13,-5-2,:最大和为20(11,-4, 13). 怎么考虑这个问题呢? 要充分利用,连续 ...
- 新浪代码部署手册 git管理工具
目前新浪云上的应用支持通过Git和SVN来部署代码. Git仓库地址 https://git.sinacloud.com/YOUR_APP_NAME SVN仓库地址 https://svn.sinac ...