新建两个需统一事务处理的数据表

--学生信息表
CREATE TABLE [dbo].[Student](
[Id] [int] NOT NULL,
[Name] [varchar](50) NOT NULL,
[Age] [int] NOT NULL,
[Address] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] --学生成绩表
CREATE TABLE [dbo].[Result](
[Id] [int] IDENTITY(1,1) NOT NULL,
[StudentId] [int] NOT NULL,
[Subject] [varchar](50) NOT NULL,
[Score] [int] NOT NULL,
CONSTRAINT [PK_Result] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

代码中定义相应的实体类

public class Student
{
/// <summary>
///编号
/// </summary>
public int StudentId { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 年龄
/// </summary>
public int Age { get; set; }
/// <summary>
/// 地址
/// </summary>
public string Address { get; set; }
}
public class Result
{
/// <summary>
/// 学生编号
/// </summary>
public int StudentId { get; set; }
/// <summary>
/// 科目
/// </summary>
public string Subject { get; set; }
/// <summary>
/// 得分
/// </summary>
public int Score { get; set; }
}

初始化对象

Student student = new Student { StudentId = , Name = "Johh", Age = , Address = "中国上海" };
List<Result> resultList = new List<Result> { new Result { StudentId = , Subject = "语文", Score = },
new Result { StudentId = , Subject = "数学", Score = } };

定义一个把实体转换成XML的通用方法

        /// <summary>
/// 把实体对象转换成Xml
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <returns></returns>
protected string GetSerializer<T>(T model)
where T : new()
{
StringBuilder sb = new StringBuilder();
XmlSerializer x = new XmlSerializer(typeof(T));
StringWriter sw = new StringWriter(sb);
x.Serialize(sw, model);
return ProcessXmlStr(sb.ToString());
}
/// <summary>
/// 处理Xml中的特殊字符
/// </summary>
/// <param name="xml"></param>
/// <returns></returns>
public string ProcessXmlStr(string xml)
{
string xmlHead = "<?xml version=\"1.0\" encoding=\"utf-16\"?>";
string strSpace = "\r\n";
string strXlnsxsi = " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"";
string strXlnsxsd = "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"";
string strNil = "xsi:nil=\"true\"";
return xml.Replace(xmlHead, "").Replace(strSpace, "").Replace(strXlnsxsi, "").Replace(strXlnsxsd, "")
.Replace("> <", "><").Replace(strNil, "").Replace("<", "&lt;").Replace(">", "&gt;");
}

把实体转换成Xml格式

     /// <summary>
/// 获取单个对象sql执行脚本
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="parameterValue">参数值</param>
/// <param name="procName">存储过程名称</param>
/// <param name="procIndex">存储过程执行顺序</param>
/// <param name="parameterName">参数名称</param>
/// <returns></returns>
protected string GetSingleExcuteSql<T>(T parameterValue, string procName, int procIndex, string parameterName) where T : new()
{
StringBuilder sb = new StringBuilder();
sb.Append(string.Format("<SP Name=\"{0}\" ProcIndex=\"{1}\" ParameterName=\"{2}\" ParameterValue=\"{3}\"></SP>",
procName, procIndex, parameterName, parameterValue != null ? GetSerializer(parameterValue) : ""));
return sb.ToString();
}
/// <summary>
/// 获取sql执行脚本
/// </summary>
/// <param name="student">学生信息</param>
/// <param name="resultList">学生成绩</param>
/// <returns></returns>
protected string GetExcuteSql(Student student, List<Result> resultList)
{
StringBuilder sb = new StringBuilder();
sb.Append(GetSingleExcuteSql<Student>(student, "Proc_Insert_Student", (int)SqlExcuteIndex.CurrentStep, "StudentXml"));
sb.Append(GetSingleExcuteSql<List<Result>>(resultList, "Proc_Insert_Result", (int)SqlExcuteIndex.CurrentStep + , "ResultXml"));
return sb.ToString();
}

组装Xml,并统一执行

        /// <summary>
/// 使用事务进行存储
/// </summary>
/// <returns></returns>
public bool ExcuteTransaction()
{
return new TestDAL().ProcessOverall("<SPList>"+GetExcuteSql(student,resultList)+"</SPList>");
}      /// <summary>
/// 事件统一执行
/// </summary>
/// <param name="allInfo"></param>
/// <returns></returns>
public bool ProcessOverall(string allInfo)
{
bool result = false;
SqlParameter param = new SqlParameter("@AllInfo", allInfo);
result = Excute("proc_flow_ProcessOverall", param, CommandType.StoredProcedure);
return result;
}

数据库创建XML处理函数

-- =============================================
-- Author: Casper
-- Create date: 2014/09/30
-- Description: 预处理xml字符串,替换特殊字符
-- =============================================
CREATE FUNCTION [dbo].[func_sys_PreProcessXmlStr] ( @xmlStr NVARCHAR(MAX) )
RETURNS NVARCHAR(MAX)
AS
BEGIN
RETURN REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@xmlStr
, '&amp;gt;','>')
, '&amp;amp;gt;','>')
, '&amp;lt;','<')
, '&amp;amp;lt;', '<')
, '&lt;', '<')
, '&gt;', '>')
, '0001-01-01T00:00:00', '') END

数据库创建单表保存存储过程

-- =============================================
-- Author: Casper
-- Create date: 2014-09-30
-- Description: 学生成绩保存
-- =============================================
CREATE PROCEDURE [dbo].[Proc_Insert_Result]
@ResultXml NVARCHAR(MAX)
AS
BEGIN
IF @ResultXml <> ''
BEGIN
--DECLARE @ResultXml NVARCHAR(MAX)='&lt;ArrayOfResult &gt;&lt;Result&gt; &lt;StudentId&gt;1&lt;/StudentId&gt; &lt;Subject&gt;语文&lt;/Subject&gt; &lt;Score&gt;80&lt;/Score&gt;&lt;/Result&gt;&lt;Result&gt; &lt;StudentId&gt;1&lt;/StudentId&gt; &lt;Subject&gt;数学&lt;/Subject&gt; &lt;Score&gt;60&lt;/Score&gt;&lt;/Result&gt;&lt;/ArrayOfResult&gt;' DECLARE @a INT
SET @ResultXml = dbo.func_sys_PreProcessXmlStr(@ResultXml) --替换XML特殊字符
EXEC sp_xml_preparedocument @a OUTPUT, @ResultXml
SELECT *
INTO #ResultInfo
FROM OPENXML(@a,'ArrayOfResult/Result',2) WITH
(
StudentId INT,
[Subject] VARCHAR(50),
Score INT
)
SELECT *
FROM #ResultInfo IF EXISTS ( SELECT * --判断新增记录是否存在,如果存在则修改,否则插入
FROM dbo.Result
WHERE Id = ( SELECT Id
FROM #ResultInfo
) )
BEGIN
UPDATE a
SET StudentId = b.StudentId ,
[Subject] = b.[Subject] ,
Score = b.Score
FROM dbo.Result a
INNER JOIN #ResultInfo b ON a.Id = b.Id
END
ELSE
BEGIN
INSERT INTO dbo.Result
( StudentId ,
Subject ,
Score
)
SELECT StudentId ,
Subject ,
Score
FROM #ResultInfo
END
END DROP TABLE #ResultInfo
END -- =============================================
-- Author: Casper
-- Create date: 2014-09-30
-- Description: 学生成绩信息保存
-- =============================================
CREATE PROCEDURE [dbo].[Proc_Insert_Result]
@ResultXml NVARCHAR(MAX)
AS
BEGIN
IF @ResultXml <> ''
BEGIN
--DECLARE @ResultXml NVARCHAR(MAX)='&lt;ArrayOfResult &gt;&lt;Result&gt; &lt;StudentId&gt;1&lt;/StudentId&gt; &lt;Subject&gt;语文&lt;/Subject&gt; &lt;Score&gt;80&lt;/Score&gt;&lt;/Result&gt;&lt;Result&gt; &lt;StudentId&gt;1&lt;/StudentId&gt; &lt;Subject&gt;数学&lt;/Subject&gt; &lt;Score&gt;60&lt;/Score&gt;&lt;/Result&gt;&lt;/ArrayOfResult&gt;'
DECLARE @a INT
SET @ResultXml = dbo.func_sys_PreProcessXmlStr(@ResultXml) --替换XML特殊字符
EXEC sp_xml_preparedocument @a OUTPUT, @ResultXml
SELECT *
INTO #ResultInfo
FROM OPENXML(@a,'ArrayOfResult/Result',2) WITH
(
Id INT,
StudentId INT,
[Subject] VARCHAR(50),
Score INT
) IF EXISTS ( SELECT * --判断新增记录是否存在,如果存在则修改,否则插入
FROM dbo.Result
WHERE Id = ( SELECT Id
FROM #ResultInfo
) )
BEGIN
UPDATE a
SET StudentId = b.StudentId ,
[Subject] = b.[Subject] ,
Score = b.Score
FROM dbo.Result a
INNER JOIN #ResultInfo b ON a.Id = b.Id
END
ELSE
BEGIN
INSERT INTO dbo.Result
( StudentId ,
Subject ,
Score
)
SELECT StudentId ,
[Subject] ,
Score
FROM #ResultInfo
END
END
END

最后创建统一事务处理存储过程

---- =============================================
---- Author: Caper
---- Create date: 2014-09-30
---- Description: 统一事务处理
CREATE PROCEDURE [dbo].[proc_flow_ProcessOverall] @AllInfo NVARCHAR(MAX)
AS
BEGIN
--DECLARE @a INT
--DECLARE @AllInfo NVARCHAR(MAX)
--SET @AllInfo = '<SPList><SP Name="Proc_Insert_Student" ProcIndex="1" ParameterName="StudentXml" ParameterValue="&lt;Student &gt;&lt;StudentId&gt;1&lt;/StudentId&gt;&lt;Name&gt;Johh&lt;/Name&gt;&lt;Age&gt;18&lt;/Age&gt;&lt;Address&gt;中国上海&lt;/Address&gt;&lt;/Student&gt;"></SP><SP Name="Proc_Insert_Result" ProcIndex="2" ParameterName="ResultXml" ParameterValue="&lt;ArrayOfResult &gt;&lt;Result&gt; &lt;StudentId&gt;1&lt;/StudentId&gt; &lt;Subject&gt;语文&lt;/Subject&gt; &lt;Score&gt;80&lt;/Score&gt;&lt;/Result&gt;&lt;Result&gt; &lt;StudentId&gt;1&lt;/StudentId&gt; &lt;Subject&gt;数学&lt;/Subject&gt; &lt;Score&gt;60&lt;/Score&gt;&lt;/Result&gt;&lt;/ArrayOfResult&gt;"></SP></SPList>' EXEC sp_xml_preparedocument @a OUTPUT, @AllInfo SELECT *
INTO #temp
FROM OPENXML (@a, 'SPList/SP',1) WITH
(
Name VARCHAR(500),
ProcIndex INT,
ParameterName VARCHAR(100),
ParameterValue NVARCHAR(MAX)
)
SELECT * FROM #temp
SELECT DISTINCT
ProcIndex ,
' exec ' + NAME
+ ( STUFF(( SELECT ',' + ' @' + ParameterName + '='''
+ ParameterValue + ''''
FROM #temp
WHERE NAME = t1.name
FOR
XML PATH('')
), 1, 1, '') ) AS ProcStr
INTO #TEMP1
FROM #temp t1 SELECT * FROM #TEMP1 --按存储过程执行顺序排序
SELECT *
INTO #TEMP2
FROM #TEMP1
ORDER BY ProcIndex SELECT * FROM #TEMP2
--
--执行存储过程
DECLARE @sql NVARCHAR(MAX)
SELECT @sql = '
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET XACT_ABORT ON
BEGIN TRANSACTION FlowProcessOverall
' + STUFF(( SELECT ';' + ProcStr
FROM #TEMP2
FOR
XML PATH('')
), 1, 1, '') +
' COMMIT TRANSACTION FlowProcessOverall '
SELECT @sql
EXECUTE sp_executesql @sql DROP TABLE #temp ,#TEMP1 ,#TEMP2
END

国庆快乐

SQL多表插入事务处理的更多相关文章

  1. C# SQL 整表插入 分类: C# 2014-09-17 16:18 369人阅读 评论(2) 收藏

    说明: (1)表A的一部分数据插入到表B (2)DataAccess 类,是放在DAL层下的底层类; da.StrConnection 写在DataAccess类中; //整表插入方法 private ...

  2. C# SQL 整表插入

    说明: (1)表A的一部分数据插入到表B (2)DataAccess 类,是放在DAL层下的底层类; da.StrConnection 写在DataAccess类中; //整表插入方法 private ...

  3. SQL数据表插入随机数(转)

    declare @T TABLE (id int identity(1,1),[Name] nvarchar(20), Randnum int) insert @T ([Name]) select ' ...

  4. MySQL中的多表插入更新与MS-SQL的对比

    MySQL多表插入: INSERT INTO tdb_goods_cates (cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_c ...

  5. 如何往有自增标识字段的表插入数据时,同时给自增标识字段插入值呢,在Inset Into语句前后加上SQL语句:SET IDENTITY_INSERT TableName ON和SET IDENTITY_INSERT TableName OFF

    当要往有设置自增标识字段的表插入数据,并希望同时设置好自增字段的值时,可以在insert into 的SQL语句前后分别加上一句sql语句,SET IDENTITY_INSERT TableName  ...

  6. SQL将一个表中的某一列值全部插入到另一个表中

    1.  SQL将一个表中的某一列值全部插入到另一个表中 插入的话: insert into a(col) select col from b; 更新的话: update a set col=selec ...

  7. 09Microsoft SQL Server 表数据插入,更新,删除

    Microsoft SQL Server 表数据插入,更新,删除 向表中插入数据 INSERT INTO insert into tb1 values(0004,'张凤凤') insert into ...

  8. sql将一个表中的数据插入到另一个表中

    sql将一个表中的数据插入到另一个表中 列名不一定要相同,只要你在HH中列出要插入列的列表跟select   from   mm表中的选择的列的列表一一对应就可以了,当然两边的数据类型应该是兼容的.  ...

  9. sql实现同时向主表和子表插入数据方法

    使用sql语句实现同时向主表和子表插入数据方法: Oracle: -- oracle创建sequence create sequence SEQ_test minvalue 1 maxvalue 99 ...

随机推荐

  1. Ajax实现xml文件数据插入数据库(二)--- ajax实现与jsp的数据交互。

    在上一篇文章中我们成功得到了重新组织后的数据,接下来需要做的便是将数据插入到数据库中了.在与数据库打交道的过程中有一些方法是普遍的,我们将这些通用方法封装到一个DbUtil类中,以便复用,封装好的Db ...

  2. kubernetes入门之kube-proxy实现原理

    kube-proxy service是一组pod的服务抽象,相当于一组pod的LB,负责将请求分发给对应的pod.service会为这个LB提供一个IP,一般称为cluster IP. kube-pr ...

  3. 利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换

    我比较喜欢听音乐,特别是周末的时候,电脑开着百度随心听fm,随机播放歌曲,躺在床上享受.但碰到了一个烦人的事情,想切掉不喜欢的曲子,还得起床去操作电脑换歌.于是思考能不能用手机控制电脑切换歌曲,经过一 ...

  4. OpenCV示例学习笔记(1)-contours2.cpp-通过findContours 函数实现轮廓提取

    这个系列的目的是通过对OpenCV示例,进一步了解OpenCV函数的使用,不涉及具体原理. 示例代码地址:http://docs.opencv.org/3.0.0/examples.html(安装op ...

  5. VR电影这一新概念在中国电影道路上的探索

    在12月的一个下午,Kevin Geiger正在进行关于VR中的故事讲述的一次再普通不过的演讲.地点是北京电影学院里一个围的水泄不通的场馆,他鼓励大家都来参与电影制作,无论是导演.演员还是电影行业的任 ...

  6. Ansible安装配置

    Ansible工具的安装与配置 Ansible基于SSH,不需要在远程端安装任何软件,只需要在管理端安装ansible及其组件即可. Ansible使用前提是已配置ssh密钥免登陆. 一.安装组件: ...

  7. MySQL中的事务

    MySQL中的事务性: MySQL的InnoDB引擎是支持事务性的,事务是由多条SQL语句组成,是一个连续的一组数据库操作.只有该组内的每一个操作都成功时,整个事务才执行成功.(例如银行转账操作,只有 ...

  8. ios之极光推送消息收到以后对消息的处理总结

    当我们的APP收到推送消息后,通常需要根据推送内容点击消息进入到指定的页面 这里讲一下收到推送消息后的处理,分为三种情况 :1.APP处于前台运行情况下     2.APP处于后台挂起情况下   3. ...

  9. IIS 批处理 bat

    c:\windows\system32\inetsrv\AppCmd.exe stop apppool /apppool.name:"ASP.NET 4.0"c:\windows\ ...

  10. 四位len灯流水

    #include <msp430x14x.h> //#include<intrins.h> #define uint unsigned int void delay(long ...