ADO.NET使用事务出错的解决(MSDTC)

简介:

原因一:没有打开MSDTC服务

步骤:

  • Componet Services-->右击My Computer--->Start MSDTC
  • Componet Services-->右击My Computer-->属性--->MSDTC-->安全配置--->勾选上我红线标注的部分。

image

 

image

原因二: 防火墙阻止

解决方法,添加135端口到Exception

image

原因三:使用了多个连接

   1: using (TransactionScope ts = new TransactionScope())
   2: {
   3:   //...
   4:   ts.complete();
   5: }

TransactionScope不允许一个事务里有多个连接,解决办法是我们加个基础类,让所有的都是用同一个连接

   1: public class BaseDataAccess
   2: {
   3:     private SqlConnection mSqlconnection;
   4:     protected SqlConnection sqlConnection
   5:     {
   6:       get
   7:       {
   8:         if (mSqlconnection == null) mSqlconnection = new SqlConnection(SqlHelper.mConnectionString);
   9:         return mSqlconnection;
  10:       }
  11:     }
  12:  }
但是这里面需要注意的是,假如我们在一组事务里如果打开多个SqlDataReader,就会出错,解决办法:

  ADO.NET 2.的一个新特征多数据结果集(Multiple Active Result Sets,简称MARS)-它允许在单个连接上执行多重的数据库查询或存储过程。这样的结果是,你能够在单个连接上得到和管理多个、仅向前引用的、只读的结果集。目前实现这个功能的数据库只有Sql Server 2005。所以当我们针对Sql Sever 2005的时候,需要重新审视DataReader对象的使用。使用SqlServer 2005,可以在一个Command对象上同时打开多个DataReader,节约数据库联接所耗费的服务器资源,在实际开发中普遍存在的一种典型的从数据库中读写数据的情形是,你可以使用多重连接而现在只用一个连接就足够了。例如,如果你有一些来自于几个表中的数据-它们不能被联结到一个查询中,那么你就会有多重的连接-每个连接都有一个与之相关连的命令用于读取数据。同样,如果你正在向一个表写数据,那么你需要另外一个连接或连接集合-如果有多个表要被更新的话。

例如下面的代码

             

   1: //MultipleActiveResultSets=true打开联接
   2:             string connstr = "server=(local);database=northwind;integrated security=true;MultipleActiveResultSets=true";
   3:             SqlConnection conn = new SqlConnection(connstr);
   4:             conn.Open();
   5:             SqlCommand cmd1 = new SqlCommand("select * from customers", conn);
   6:             SqlCommand cmd2 = new SqlCommand("select * from orders", conn);
   7:             SqlDataReader rdr1 = cmd1.ExecuteReader();
   8:            // next statement causes an error prior to SQL Server 2005
   9:             SqlDataReader rdr2 = cmd2.ExecuteReader();
  10:            // now you can reader from rdr1 and rdr2 at the same time.
  11:             conn.Close();

王德水 祝你编程愉快

本文转自敏捷的水博客园博客,原文链接http://www.cnblogs.com/cnblogsfans/archive/2009/03/26/1422202.html如需转载请自行联系原作者


王德水

相关文章
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
38 7
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
54 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
46 0
|
3月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
3月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
120 0
|
6月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
189 0
|
6月前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
78 0
|
6月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
328 5
|
6月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界