平常新增多条记录,需要多次访问数据库,这样会影响性能;如果把新增的数据拼接成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("<", "&lt;");
  str = str.Replace(">", "&gt;");
  str = str.Replace("&", "&amp;");
  str = str.Replace("'", "&apos;");
  str = str.Replace("\"", "&quot;");
}
  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调用存储过程来优化系统性能的更多相关文章

  1. CSharp 如何通过拼接XML调用存储过程来查询数据

    每查询数据,需要访问一次数据库,这样会影响性能:如果把查询的数据拼接成XML形式,作为一个参数整体传给存储过程来处理,这只访问数据库一次,执行速度会快很多. 1.C#代码如下: /// <sum ...

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

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

  3. FineReport调用存储过程

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

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

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

  5. IBatis.Net使用总结(四)-- IBatis 调用存储过程

    IBatis 调用存储过程 http://www.cnblogs.com/jeffwongishandsome/archive/2010/01/10/1543219.html http://www.c ...

  6. MyBatis学习总结(六)——调用存储过程(转载)

    本文转载自:http://www.cnblogs.com/jpf-java/p/6013518.html 一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存 ...

  7. MyBatis入门学习教程-调用存储过程

    一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 create table p_user( id int primary key auto_incr ...

  8. Java和Ibatis调用存储过程并取得返回值详解

    Java和Ibatis调用存储过程并取得返回值详解 2011-07-19 17:33 jiandanfeng2 CSDN博客 字号:T | T 本文主要介绍了Java和Ibatis调用存储过程的方法, ...

  9. Spring JdbcTemplate 调用存储过程

    遇到调用存储过程的业务,以前有用过,但不是用Spring的 JdbcTemplate去做的,这次是在一个已经有的SpringMVC框架的项目下写处理存储过程的. 参考网络中的方法,在实际操作中遇到两个 ...

随机推荐

  1. nno_setup制作升级包必须面临的几个问题 2

    这两天的时间一直在制作应用程序的升级包,期间碰到一些问题这里一并记录下来,相信这是制作升级包必须面临和解决的问题: 1. 升级包安装程序如何不再产生新的安装.卸载程序 Inno_setup中AppId ...

  2. JQuery事件手册

    blur.focus     blur失去焦点:focus获得焦点 load 当指定的元素(及子元素)已加载时,会发生 load() 事件 resize 当调整浏览器窗口的大小时,发生 resize ...

  3. Android 常见的广播 action常量

    Intent.ACTION_AIRPLANE_MODE_CHANGED; //关闭或打开飞行模式时的广播 Intent.ACTION_BATTERY_CHANGED; //充电状态,或者电池的电量发生 ...

  4. jQuery对象与DOM对象之间的转换

    刚开始学习jQuery,可能一时会分不清楚哪些是jQuery对象,哪些是DOM对象.至于DOM对象不多解释,我们接触的太多了,下面重点介绍一下jQuery,以及两者相互间的转换. 什么是jQuery对 ...

  5. Optimizing shaper — hashing filters (HTB)

    I have a very nice shaper in my linux box :-) How the configurator works — it’s another question, he ...

  6. eclipse关联源码 Failed to create the part's controls

    在eclipse中关联源码时: 1.出现Failed to create the part's controls错误, 2.而attach source 这个按钮却没有出现. 问题原由:eclipse ...

  7. 快排算法(C++版)

    #include <iostream> using namespace std; /** Quick Sort * * split: cmp && swap * left ...

  8. css link和@import区别

    1.link语法结构 <link href="CSSurl路径" rel="stylesheet" type="text/css" / ...

  9. Apache运行模式

    Apache 2.X 支持插入式并行处理模块,称为多路处理模块(MPM: Multi-Processing Modules).在编译apache时必须选择也只能选择一个MPM,对类UNIX系统,有几个 ...

  10. 1-4-1 Windows应用程序组成及编程步骤

    主要内容:介绍Windows应用程序的组成以及编程步骤 1.应用程序的组成 <1>一个完整的应用程序通常由五种类型的文件组成 1.源程序文件 2.头文件 3.模块定义文件 4.资源描述文件 ...