在C#中使用COM+实现事务控制
一般来说,在IT技术界以及硬件产业,技术的更新换代速度非常得惊人,而惯例是所有的新技术都会遵循向下兼容的原则,但是.NET技术不仅仅做到了这一点,.NET甚至实现了相互之间的各自调用,这一点是非常难能可贵的。也就是说,不但我们可以在.NET组件中调用COM组件,同时也可以在COM组件中正常的调用.NET组件。这点带来的好处是显而易见的,一方面我们可以保持现有的技术资源,另一方面,在现有资源中可以利用.NET所带来的各种新技术。
一般的数据库事务控制要求事务里所做的操作必须在同一个数据库内,这样在出现错误的时候才能回滚(RllBack)到初始状态。这就存在一个问题,在分布式应用程序中,我们往往需要同时操作多个数据库,使用数据库本身的事务处理,很难满足程序对事务控制的要求。在COM+中,提供了完整的事务服务,我们可以利用它来完成在分布式应用程序中的事务控制。
具体过程如下
一:用VS.NET生成一个类库 。
二:添加对System.EnterpristServices的引用,具体步骤
菜单:(项目-添加引用-在.NET选项卡选择System.EnterpristServices-确定)
三:构建类
1:源程序
using System;
using System.EnterpriseServices;
using System.Data.SqlClient;
using System.Reflection;
namespace COMPlusSamples
{
//表明需要事务支持
[ Transaction(TransactionOption.Required) ]
//声明为服务器应用程序,还可以选择Library,表示为库应用程序
[assembly: ApplicationActivation(ActivationOption.Server)]
//描述信息
[assembly: Description("sample")]
public class TxCfgClass : ServicedComponent
{
private static string init1 = "user id=sa;password=;initial catalog=pubs;data source=(local)";
private static string init2 = "user id=sa;password=;initial catalog=NorthWind;data source=(local)";
private static string add1 = "insert into authors('au_lname','au_fname') values('test1', 'test2')";
private static string add2 = "insert into sample values('test1',22)";
//the error sql statement
//there is not table “sample”
public TxCfgClass() {}
private void ExecSQL(string init, string sql)
{
SqlConnection conn = new SqlConnection(init);
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = sql;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
//添加一条记录到数据库
public void Add()
{
try
{
//在一数据库中插入一条记录
ExecSQL(init1, add1);
Console.WriteLine("the operation in the same database completely");
//在另外一个数据库中插入两条记录
//这次执行的是一个错误的SQL语句
ExecSQL(init2, add2);
Console.WriteLine("the operation in the other database
completely");
Console.WriteLine("Record(s) added, press enter...");
Console.Read();
}
catch(Exception e)
{
//事务回滚
ContextUtil.SetAbort();
Console.WriteLine("Because there are some errors in the operation ,so transcation abort");
Console.WriteLine("The error is " + e.Message);
Console.WriteLine("abort successfully");
Console.Read();
}
}
}
}
2:程序说明:
添加命名空间 using System.EnterpriseServices;因为本程序使用了其中的ContextUtil类
[ Transaction(TransactionOption.Required) ] 说明DLL需要事务支持。
本程序的TxCfgClass 类从ServicedComponent类中继承,这样并不会影响该类,而只是在该类中添加了两个额外的方法,这两个方法可以使代码共享变得更加容易。
程序使用的sql server数据库在本机运行,init1 和 init2是两个连接数据库的连接字符串,init连接pubs数据库,inin2连接northwind数据库,这是sql2000中自带的示例数据库。add1和add2是两条sql语句,作用是分别向两个数据库的表里添加一条记录。注意:add2是一条错误的语句,因为根本没有sample表,这样,会在执行时引起异常。(这正是我们所期望的)
在执行到add2语句时,由于它是错误的,所以会引发异常,转到错误处理语句里来执行。
ContextUtil.SetAbort();该语句使所有的数据库操作回滚,这样add1语句所插入的记录也将不存在。(达到预期目标)
四:给程序添加强名(strong name)
1:创建一对密钥
用来创建密钥的工具是称为sn.exe的共享工具。通常通过命令提示运行它,该工具可执行各种任务以生成并提取密钥。我们需要用以下方式来运行sn.exe。
sn –k key.snk
其中key.snk 代表将保存密钥的文件的名称。它的名称可以是任意的,不过习惯上带有.snk后缀名。
2:签名
签名通常是在编译时进行的。签名时,用户可利用C#属性通知编译器应该使用正确的密钥文件对DLL进行签名。要做到这一点用户需要打开工程中的AssemblyInfo.cs文件并进行修改。
[assembly:AssemblyKeyFile(“..//..//key.snk”)]
注:key.snk文件和项目文件在同一个文件夹
五:编译成DLL (具体步骤)
菜单:(生成-生成)
如果一切正常,就会生成DLL文件
六:使用regsvcs.exe将Dll注册到COM+ Services里面
我们需要用以下方式运行regsvcs.exe
regsvcs dll文件名
如果一切正常的话,regsvcs.exe就会把dll输入到COM+ Services中。
至此,我们已经生成并注册了这个可以由其它程序使用的类,现在,我们来写一个控制台程序来检验这个类是否正常运行
七:构建客户机
1:新建控制台应用程序项目
菜单(文件-新建-项目)
选择控制台应用程序 ,并选择 添入解决方案 ,确定
2:同上面的第二步一样,添加对System.EnterpriseServices的引用。
3:添加对自己刚才做好的类的引用。
菜单(项目-添加引用-浏览),选择刚才生成的DLL,确定
4:输入以下程序
using System;
using COMPlusSamples;
using System.EnterpriseServices;
public class Client
{
public static void Main()
{
TxCfgClass cfg = new TxCfgClass();
cfg.Add();
}
}
5:将控制台程序设置为启动项,然后编译运行,就会看到结果。
正如我们希望的,第一条记录没有插入数据库
相关文章:

深入理解 JavaScript 中的 replace 方法
2019独角兽企业重金招聘Python工程师标准>>> 字符串替换字符串 1 I am loser! .replace( loser , hero ) //I am hero! 直接使用字符串能让自己从loser变成hero,但是如果有2个loser就不能一起变成hero了。 1 I am loser,You are loser .replace( loser ,…

透过计算机视觉,看看苏伊士运河堵船
作者 | Edison_G来源 | 计算机视觉研究院头图 | 下载于视觉中国3月29日,长赐号终于重新上浮。船运代理公司Inchcape和苏伊士运河管理局皆证实,长赐号已经重新漂浮在水面上,但目前还不清楚需要多少时间重启运河。这张图片,相信大家…

泼点冷水,P2P借款限额是不是想的太美好?
8月24日等待了大半年的P2P网贷监管规则《网络借贷信息中介机构业务活动管理暂行办法(评估稿)》终于出现。办法中最引人注意的是对借款上限的规定: 同一自然人在同一网络借贷信息中介机构平台的借款余额上限不超过人民币20万元,在不…

SQL语句优化技术分析
SQL语句优化技术分析 操作符优化 IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。 但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别: ORACLE试图将…

官方抓虫,PyTorch 新版本修复 13 项 Bug
整理 | 寇雪芹头图 | 下载于视觉中国出品 | AI科技大本营(ID:rgznai100)近日,PyTorch 发布了新版本 PyTorch 1.8.1,相比3月4日从 PyTorch 1.7 到 1.8 的重要更新( 1.8 版本主要包括编译器和分布式训练更新&…

开发webpart时建立图像文件夹和CSS,js文件夹
如图所示:是通过添加映射来完成,做好之后,把图像拷到文件夹时,当ascx文件里需要用到图像时,直接把图像拖到ascx文件里的位置。这样就知道该图像的路径 了。转载于:https://www.cnblogs.com/oymx/p/3490175.html

AI金融若不解决这些问题,等于在制造新的不可解问题
人们对新事物总是充满恐惧。就在大家担心无人驾驶汽车是否弊大于利的时候,AI重塑金融规律的创新也引起许多人对其中的法律和道德问题的顾虑。 让一个软件程序来决定,谁拥有投资开户的资格,谁能够获得贷款(征信)&#x…

Java 领域 offer 收割:程序员黄金 5 年进阶心得!
怎样才能拿到大厂的offer?没有掌握绝对的技术,那么就要不断的学习。如何拿下阿里等大厂的offer的呢,今天分享一个秘密武器,资深架构师整理的Java核心知识点,面试时面试官必问的知识点,篇章包括了很多知识点…

TCP连接的状态转换图深度剖析
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图1所示。(1)第一次握手:建立连接时,客户端A发送SYN包(SYNj)到服务器B,并进入SYN_SE…

ASP.Net中的TreeView控件中对节点的上移和下移操作
Web中的TreeView中的没有PreNode和NextNode属性。 但它的集合属性中有一个IndexOf属性,从而能够找到它的前一个节点知后一个节点。 TreeView中要么只有一个根节点;要么没有根节点,都是并列排的,这个要判断。 这里主要是用了递归&a…

大数据流通存隐忧 产业信任体系亟待建立
就在今年10月,始于美国东部的“DDoS攻击”席卷了整个美国,引起了人们对数据安全的恐慌,大数据安全问题逐渐暴露。在第三届世界互联网大会的大数据分论坛上,中国科学院秘书长邓麦村在致辞中指出,如何突破大数据关键技术…

ImageNet十年,AI数据标注如何蓬勃发展?
2016 年,AlphaGo 战胜李世石,成为新一代 AI 浪潮的重要里程碑事件。 经此一役,很多人都认识到了算法和算力对 AI 发展的重要性,确忽略了另一个重要因素:数据。 2009 年,时任斯坦福大学任助理教授的李飞飞…

关于webservice的异步调用简单实例
于webservice的异步调用简单实例无论在任何情况下,被调用方的代码无论是被异步调用还是同步调用的情况下,被调用方的代码都是一样的, 下面,我们就以异步调用一个webservice 为例作说明。这是一个webservice <WebMethod(Descrip…

理解NSAttributedString
An NSAttributedString object manages character strings and associated sets of attributes (for example, font and kerning) that apply to individual characters or ranges of characters in the string. 这句话就是对这个类的一个最简明扼要的概括。NSAttributedString…

Redis集群两种配置方式
2019独角兽企业重金招聘Python工程师标准>>> 第一种使用:JedisCluster <bean id"jedisPoolConfig" class"redis.clients.jedis.JedisPoolConfig"><property name"maxTotal" value"30" /><proper…

调用API弹出打印机属性对话框
调用api弹出打印机属性对话框 Author:vitoriatangFrom:Internet.NET Framework封装了很多关于打印的对话框,比如说PrintDialog, PageSetupDialog. 但是有的时候我们还需要关心打印机属性对话框,那么就可以调用API来解决这个问题。有几个API函数与之相关P…

Oracle DBA学习互联网化的内容
搞了多年的Oracle数据库维护,近几年来,个人感觉基本都在舒适区,技术上没啥进步。而且由于个人资料或者学习方法的限制,Oracle数据库技术上再想精进感觉事倍功半。2013年开始,去IOE的声势搞得轰轰烈烈,mysql…

离不开深度学习的自动驾驶
作者 | 小白来源 | 小白学视觉头图 | 下载于视觉中国深度学习在整个自动驾驶技术的各个部分中进行了应用,例如在感知,预测和计划中都有应用。同时,深度学习也可以用于制图,这是高级自动驾驶的关键组成部分。拥有准确的地图对于自动…

IOS -- base64编码
在iOS7以后可以用NSData自带的base64EncodedStringWithOptions进行编解码: 方法如下: - (NSString *)encodeToBase64String:(UIImage *)image {return [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64Charact…

OpenCV持久化(二)
如何利用OpenCV持久化自己的数据结构?我们来看看OpenCV中的一个例子。 MyData.hpp定义自己的数据结构MyData如下: #ifndef MYDATA_HPP #define MYDATA_HPP#include <opencv2/core/core.hpp> #include <iostream> #include <string>using namespac…

Excel、Exchange和C#
摘要:Eric Gunnerson 将向您介绍如何使用 Outlook、Excel 和 C# 创建自定义的日历,该日历可以提供适用于短期项目和长期项目的清晰明了的版式。 下载 csharp05152003_sample.exe 示例文件(英文)。 虽然一月份已经过去了&#x…

这个宝藏工具,给你一种黑客般的感觉
明天要交作业了,吴检正在宿舍熬夜爆肝拼命敲代码,劈里啪啦的键盘声和咔咔的鼠标声格外嘈杂,室友陈琛瞥了一眼,背过身,沉沉睡去,留下他一人在深夜无尽的黑暗中,断断续续却又没有尽头的咔咔声中凌…

LSTM神经网络
LSTM是什么 LSTM即Long Short Memory Network,长短时记忆网络。它其实是属于RNN的一种变种,可以说它是为了克服RNN无法很好处理远距离依赖而提出的。 我们说RNN不能处理距离较远的序列是因为训练时很有可能会出现梯度消失,即通过下面的公式训…

用C#实现在PowerPoint文档中搜索文本
用编程的方式根据对象模型很容易实现在Word、Excel文档中搜索文本,在PowerPoint里面也同样如此,使用对象模型有助于我们了解office的文档结构。 搜索的思路和方法基本是一样的,用PowerPoint应用程序对象打开指定的文档,用文档对象…

雷军的最后一次 重 大 创 业
这是我人生最后一次重大创业项目。我愿意押上人生全部的声誉,亲自带队,为小米汽车而战!——雷军作者 | Carol头图 | 下载于视觉中国出品 | CSDN(ID:CSDNnews)3月29日19:30,小米春季新品发布会拉…

shell之冒号的作用
冒号: :在shell中是一种命令,意思是总是为真,但是却不做任何操作,即总是为真的空命令eg:[rootlocalhost ~]# ${abc:t1}-bash: t1: command not found[rootlocalhost ~]# : ${abc:t1}[rootlocalhost ~]# echo $abct1[ro…

关于epel源的配置
EPEL,即Extra Packages for Enterprise Linux,这个软件仓库里有很多非常常用的软件,而且是专门针对RHEL设计的,对RHEL标准yum源是一个很好的补充,完全免费使用,由Fedora项目维护,所以如果你使用的是RHEL&am…

C#如何在Form中嵌入并且操作Excel表格
网上比较多讲述如何操作excel表的文章,但都是启动excel的窗口来打开excel数据文件。有时候需要把excel表嵌入到自己程序的form中,给客户一个不用切换窗口的操作界面,似乎更好。这在vc中用ole技术很容易实现,但是在c#中方法就不一样…

自研芯片架构 ,这家中国公司发布DPU芯片计划
近日,专注于智能计算领域的DPU芯片和解决方案公司中科驭数发布了其下一代DPU芯片计划,将基于自研的KPU(Kernel Processing Unit)芯片架构,围绕网络协议处理、数据库和大数据处理加速、存储运算、安全加密运算等核心功能࿰…

QQ超时不能刷新好友接收发送信息
如果您在其它电脑登录时正常,只在本地出现此种情况,可能与您本机的设置及网络限制有关,建议您先确保安装的是我司的官方版本,然后再搜索并删除您的QQ号码文件夹(会丢失聊天记录,请注意备份)&…