平常新增多条记录,需要多次访问数据库,这样会影响性能;如果把新增的数据拼接成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. asp登陆例子,asp,mssql,登陆

    login.aspx文件 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="log ...

  2. HDU 1721

    http://acm.hdu.edu.cn/showproblem.php?pid=1721 非常有趣的一道水题,注意到相隔一个点的粒子数是可以相互转移的,所以只要判红点的和与蓝点的和是否相等 #in ...

  3. Build AssetBundle, missing shader.

    Build AssetBundle, missing shader. 0   My uniy version is 4.1.2f1. Every asset file packing to a sin ...

  4. magento-connect-manage出现404或者500内部错误的解决办法

    将网站根目录下的downloader文件权限改为755,将downloader下的index.php文件的权限改为644即可:

  5. vi的用法 【转】

        vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器 ...

  6. uninstall gitlab

    Stop gitlab and remove its supervision process sudo gitlab-ctl uninstall Debian/Ubuntu sudo dpkg -r ...

  7. Qt之QCheckBox

    简述 QCheckBox继承自QAbstractButton,它提供了一个带文本标签的复选框. QCheckBox(复选框)和QRadioButton(单选框)都是选项按钮.这是因为它们都可以在开(选 ...

  8. Apache Flex + Adobe Flash Builder环境配置

    在开始学习Flex之前,需要配置开发环境.Apache Flex SDK包含了你开发所需要的东西,当然除了集成开发环境(Integrated Development Environment,IDE). ...

  9. db2 字符串转换 数字

    今天使用聚合函数的时候 发现 varchar类型的是不可用的,所以呢就开始想办法解决 用到了转换函数cast(s.score as bigint) 然后有一个问题就是如果数据为空的话就会发生转换错误. ...

  10. 349. Intersection of Two Arrays

    Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, 2, 1] ...