使用.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)各位帮忙看一下怎么回事!谢谢!急。
业务层方法如下:
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)各位帮忙看一下怎么回事!谢谢!急。
启用网络 DTC 访问的步骤
1. 单击“开始”,指向“控制面板”,然后单击“添加/删除程序”。
2. 单击“添加/删除 Windows 组件”。
3. 选择“应用程序服务器”,然后单击“详细信息”。
4. 选择“启用网络 DTC 访问”,然后单击“确定”。
5. 单击“下一步”。
6. 单击“完成”。
7. 停止分布式事务协调器服务,然后重新予以启动。
8. 停止参与分布式事务的任何资源管理器服务(如 Microsoft SQL Server 或 Microsoft Message Queue Server),然后重新予以启动。
服务器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)
------------------------------------------------------
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()
2。就这些编码么?
参考一下这个帖子里的连接
http://parmeshwar.blogsome.com/2005/10/05/com-exceptionthe-transaction-has-already-been-implicitly-or-explicitly-committed-or-aborted/
代码就这么多。其他无关的代码没有贴出来。
我怀疑是Enterprise Library的问好分数据库访问代码
有问题。
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操作系统