使用.NET FrameWork中System.Transction.dll
业务层方法如下:
        public RpoEntity RpoToPo(RpoEntity insRpo)
        {
            RpoEntity rpo = null;            using (TransactionScope ts = new TransactionScope())
            {
                //更改请购单的状态为已开采购单
                rpo = RpoManageMapper.ToPo(insRpo);                              PoEntity poEntity = GetPoByRpo(rpo);
                //在采购单数据库中新增一张采购
                poEntity = new Po().InsertPo(poEntity);                rpo.ToPoNo = poEntity.PoNo;                ts.Complete();
            }            return rpo;
        }/////数据库访问使用Enterprise Library Data Access Application Block,方法如下:
       //更改请购单的状态为已开采购单
        public static RpoEntity ToPo(RpoEntity rpo)
        {
            Database db = DatabaseFactory.CreateDatabase();            rpo.Status = "openpoed";
            rpo.LastActionTime = DateTime.Now.ToString();            string sqlCommand = @"Update PoManageRpoMaster set 
  Status         = '{1}'
 ,LastActionCode = '{2}'
 ,LastActionTime = '{3}'
 ,LastActionUser = '{4}'
  where RpoNo    = '{0}'";            sqlCommand = string.Format(sqlCommand, rpo.RpoNo, rpo.Status,rpo.LastActionCode, rpo.LastActionTime, rpo.LastActionUser);            DBCommandWrapper dbCommandWrapper = db.GetSqlStringCommandWrapper(sqlCommand);            db.ExecuteNonQuery(dbCommandWrapper);            return rpo;
        }//在采购单数据库中新增一张采购
public static PoEntity InsertPo(PoEntity Po)
{
Database db = DatabaseFactory.CreateDatabase();
string Now = DateTime.Now.ToString();

Po.PoNo = SysObjectMapper.GetNewObjectInstanceCode(Po.ObjectCode);
Po.Status = "new";
Po.CreateTime = Now;
Po.LastActionTime = Now; string sqlCommand  = @"insert into PoManagePoMaster(PoNo,PoTypeCode,PoTypeName,VendorCode,VendorName,
GroupCode,GroupName,ReceiveAddrValue,TransitType,
Buyer,Payment,Status,DeliveryLateDays,Comment,
CreateTime,CreateUser,
LastActionCode, LastActionTime, LastActionUser)
Values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}','{13}','{14}','{15}','{16}','{17}','{18}') ";
sqlCommand = string.Format(sqlCommand,Po.PoNo,Po.PoTypeCode,Po.PoTypeName,Po.VendorCode,Po.VendorName,
Po.GroupCode,Po.GroupName,Po.ReceiveAddrValue,Po.TransitType,
Po.Buyer,Po.Payment,Po.Status,Po.DeliveryLateDays,Po.Comment,
Po.CreateTime,Po.CreateUser,
Po.LastActionCode,Po.LastActionTime,Po.LastActionUser); DBCommandWrapper dbCommandWrapper = db.GetSqlStringCommandWrapper(sqlCommand);
db.ExecuteNonQuery(dbCommandWrapper);
UpdatePoDetail(Po);
return Po;
}//最终客户端调用却出来下列错误码:
System.Transactions.TransactionException: 该伙伴事务管理器已经禁止了它对远程/网络事务的支持。 (异常来自 HRESULT:0x8004D025) ---> System.Runtime.InteropServices.COMException (0x8004D025): 该伙伴事务管理器已经禁止了它对远程/网络事务的支持。 (异常来自 HRESULT:0x8004D025)各位帮忙看一下怎么回事!谢谢!急。

解决方案 »

  1.   

    使用使用.NET FrameWork2.0中System.Transction.dll
      

  2.   

    win2003缺省禁用远程/网络事务,启用的步骤如下: 
    启用网络 DTC 访问的步骤 
    1. 单击“开始”,指向“控制面板”,然后单击“添加/删除程序”。 
    2. 单击“添加/删除 Windows 组件”。 
    3. 选择“应用程序服务器”,然后单击“详细信息”。 
    4. 选择“启用网络 DTC 访问”,然后单击“确定”。 
    5. 单击“下一步”。 
    6. 单击“完成”。 
    7. 停止分布式事务协调器服务,然后重新予以启动。 
    8. 停止参与分布式事务的任何资源管理器服务(如 Microsoft SQL Server 或 Microsoft Message Queue Server),然后重新予以启动。 
      

  3.   

    多谢lidong6(立冬)的提示:
    服务器Sql Server忘记启动DTC了
    可是现在却出现了:
    System.Transactions.TransactionException: 事务已被隐式或显式提交,或已终止。 ---> System.Runtime.InteropServices.COMException (0x8004D00E): 此事务已明地或暗地被确认或终止 (异常来自 HRESULT:0x8004D00E)   在 System.Transactions.Oletx.ITransactionShim.Export(UInt32 whereaboutsSize, Byte[] whereabouts, Int32& cookieIndex, UInt32& cookieSize, CoTaskMemHandle& cookieBuffer)   在 System.Transactions.TransactionInterop.GetExportCookie(Transaction transaction, Byte[] whereabouts)
      

  4.   

    完错误如下:
    ------------------------------------------------------
    System.Transactions.TransactionException: 事务已被隐式或显式提交,或已终止。 ---> System.Runtime.InteropServices.COMException (0x8004D00E): 此事务已明地或暗地被确认或终止 (异常来自 HRESULT:0x8004D00E)   在 System.Transactions.Oletx.ITransactionShim.Export(UInt32 whereaboutsSize, Byte[] whereabouts, Int32& cookieIndex, UInt32& cookieSize, CoTaskMemHandle& cookieBuffer)   在 System.Transactions.TransactionInterop.GetExportCookie(Transaction transaction, Byte[] whereabouts)   --- 内部异常堆栈跟踪的结尾 ---Server stack trace:    在 System.Transactions.Oletx.OletxTransactionManager.ProxyException(COMException comException)   在 System.Transactions.TransactionInterop.GetExportCookie(Transaction transaction, Byte[] whereabouts)   在 System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)   在 System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)   在 System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction)   在 System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)   在 System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)   在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)   在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)   在 System.Data.SqlClient.SqlConnection.Open()   在 Microsoft.Practices.EnterpriseLibrary.Data.Database.OpenConnection()   在 Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteNonQuery(DBCommandWrapper command)   在 DataAccessObject.RpoManageMapper.ToPo(RpoEntity rpo)   在 BusinessRules.Rpo.RpoToPo(RpoEntity insRpo)   在 System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)   在 System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(RuntimeMethodHandle md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)   在 System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)Exception rethrown at [0]:    在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)   在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)   在 RemoteFacade.IRpo.RpoToPo(RpoEntity insRpo)   在 PoManage.RpoManage.ToNext()
      

  5.   

    1。用的什么数据库?什么服务器?
    2。就这些编码么?
    参考一下这个帖子里的连接
    http://parmeshwar.blogsome.com/2005/10/05/com-exceptionthe-transaction-has-already-been-implicitly-or-explicitly-committed-or-aborted/
      

  6.   

    用的是Sql Server 2000,Window 2003 Server操作系统
    代码就这么多。其他无关的代码没有贴出来。
    我怀疑是Enterprise Library的问好分数据库访问代码
    有问题。
      

  7.   

    解決這個問題我也花了好長的時間:最後發現解決方式
    1.先在程序計算機上設置MSDTC:控制面板->管理工具->組件服務->我的電腦->右jiang->屬性->MSDTC->安全配置(Security Configuration)->打開Network DTC Access 同時打上
    Allow Inbound ,Allow Outbound ,No Authentication Required,Enable Transaction Internet Protocol[TIP] Transaction
    2.請在遠程數據庫計算機上做1同樣的事情3.雙方計算機重新啟動MSDTC4.這樣就可以了5.如果還不行,請通知我
    --------------------------------------------------
    順便說一下,我這兒是可以的:Sql Server 2000, Window 2003 Server操作系统
      

  8.   

    我也遇到这个问题,在网上也查找了不少解决的办法,我也按照上面的方法处理过,可是还是不能解决这个问题,请问还有什么原因导致这个问题的产生?我用的是SQL2000, Web服务器和数据库服务器都是XP操作系统,若Web服务器和数据库服务器是同一台主机就无问题,但放在不同的主机就会出现上面的情况???