C# 如何通过拼接XML调用存储过程来优化系统性能

平常新增多条记录,需要多次访问数据库,这样会影响性能;如果把新增的数据拼接成XML形式,作为参数传给存储过程来处理,这只访问数据库一次,执行速度会快很多。

1.C#代码如下:

//拼接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 = 0;
    try
    {
        if (list != null && list.Count > 0)
        {
            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") : "0"
                        ,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

  --解析移库单MovementItemWmsInfo的XML信息
  IF @MovementItemWmsInfoTOXML IS NOT NULL
  BEGIN
     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
     );
     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调用存储过程来优化系统性能

时间: 2024-11-05 22:45:29

C# 如何通过拼接XML调用存储过程来优化系统性能的相关文章

C# 如何通过拼接XML调用存储过程来查询数据

每查询数据,需要访问一次数据库,这样会影响性能:如果把查询的数据拼接成XML形式,作为一个参数整体传给存储过程来处理,这只访问数据库一次,执行速度会快很多. 1.C#代码如下: /// <summary> /// 查询订单信息 /// </summary> /// <param name="WhereXML">查询条件XML格式</param> /// <param name="OrderBy">排序字段&

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

一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 1 create table p_user( 2 id int primary key auto_increment, 3 name varchar(10), 4 sex char(2) 5 ); 6 7 insert into p_user(name,sex) values('A',"男"); 8 insert into p_user(name,sex) values('B',&qu

导入Excel用户表,调用存储过程

花了一天半的时间学习了一下导入Excel用户表,调用存储过程,主要是学习存储过程.因为之前没有具体在项目中应用过. 这里我们采用导入Excel到临时表,然后存储过程中读取临时表判断数据类型和数据格式,然后保存到正式表. 导入Excel采用spring 的POI技术. 本文内容较多,请选择性阅读. controller里面的代码: /**  * Excel导入用户表,调用存储过程,先导入临时表,再在存储过程中判断,判断通过后导入正式表,错误的则记录错误日志表中. lijianbo  *   * @

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

孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(六)--调用存储过程 一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 1 create table p_user( 2 id int primary key auto_increment, 3 name varchar(10), 4 sex char(2) 5 ); 6 7 insert into p_user(name,sex) values('A',"男");

[原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

EF和LINQ 调用存储过程

好久没有更新文章了,最近项目比较忙都没什么时间来分享最近的问题. 今天遇到一个超级傻逼的问题.C#中调用存储过程,自己code也10来年了,这应该是很简单的问题了.今天有2个新的api,一个只有1个参数, 一个有10多个参数,先前没有注意到对象类型, 以为是EF的DbContext,结果后来才发现是LINQ的DataContext对象.以前调用存储过程都是靠设计界面封装成方法. 现在designer界面有500多张表, 几年没有维护了,大家要修改什么东东都是直接改代码.所以这里以后台代码调用存储

Hibernate(十三)命名查询-批量处理和调用存储过程

一.命名查询 HQL语句混杂在代码之间将破坏代码的可读性 Hibernate允许在映射配置文件中定义字符串形式的查询语句,这种查询方式称为命名查询 二.建立数据表和持久化类 建立数据表 create table login ( username varchar2(32) primary key, password varchar2(32) not null , age number(3) ); insert into login select '张三','123456',21 from dual

openTSP连接sqlServer数据库&amp;jpa调用存储过程

openTSP框架下的模块都是连接mysql数据库,近期青汽有连接sqlServer数据库的需求,在调研后配置了sqlServer数据库,使用jpa调用存储过程,中间也踩了不少坑,总结一下,避免大家再掉进去. 1.首先配置sqlServer的依赖 <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>sqljdbc4</artifactId> <version

MyBatis学习总结_06_调用存储过程

一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据库表和存储过程 1 create table p_user( 2 id int primary key auto_increment, 3 name varchar(10), 4 sex char(2) 5 ); 6 7 insert into p_user(name,sex) values('A',"男"); 8 insert into p_user(name,sex) values('B',&qu