最近重做了本本的操作系统,顺便把9i换成了10g,结果新创建的 WEB SERVICE 产生了如下错误:
WEB SERVICE 的代码如下:
开始估计是 10g 的驱动什么的出了问题。上网搜索解决办法。发现有不少的类似的问题。但是没有什么很好的解决的方法。
网上这么说:
his is an Oracle change, not an MS issue. If you go to otn.oracle.com and
look up ODP.NET, you will find that the two Oracle versions of the ODP (pre
10g and 10g) are different, as well. MS has not updated its implementation
for 10g yet.
基于上面的说法,开始以为9i应该就没有问题了。于是把10g卸载,重新,安装9i 。
结果发现也是产生的同样的问题。但是无论在9i还是10g下面,和WEB SERVICE在同一个目录下面的asp.net页面都运行的非常好。于是就百思不得其解。给我郁闷坏了。当时怎么也找不到解决的办法。
网上也找到一些相关的内容。根据里面的设置,也没有起作用。
参见:配置Oracle,使它支持MTS下分布事务 、在MTS使用ODP读写Oracle是出现无法加载OraMTS的解决办法
根据里面的设置,也没有起作用。
就上oracle的网站上看看。没有metlink帐号,所以找东西找的也很辛苦。也基本上没有什么收获。后来,决定不找了,自己看看代码,找出问题到底出在哪儿。
鉴于在web service中的事务处理不好用,那就从web serivce上下手。我试着换掉了事务处理的代码。不进行事务处理,把 TransactionOption=TransactionOption.Required 这一句也去掉。运行,一切正常。看来是事务处理相关的Component 出现了错误。正好看到oracle网上有 ODP.net的 9207的版本,于是就看了看主要的内容,看到里面有一个 Oracle Services For Microsoft Transaction Server 9.2.0.7.0 而我的机器上的是9.2.0.1.0版本的,于是下载下来,升级。接着运行带有事务处理的web service,提示出现引用对象为空的异常,以前的没有找到dll文件的异常没有了。一阵狂喜,呵呵,离成功不远了。考虑安装过程中替换了一些dll可能需要重新启动才能生效。于是重新启动。试着运行。ok!正常运行。问题解决。心情轻松了不少!
System.DllNotFoundException: 无法加载 DLL (oramts.dll)。 at System.Data.OracleClient.UnsafeNativeMethods.OraMTSJoinTxn(HandleRef pCtxt, ITransaction pTrans) at System.Data.OracleClient.TracedNativeMethods.OraMTSJoinTxn(HandleRef pCtxt, ITransaction pTrans) at System.Data.OracleClient.OciEnlistContext.Join(ITransaction transaction) at System.Data.OracleClient.OracleInternalConnection.Enlist(String userName, String password, String serverName, ITransaction transaction, Guid transactionGuid) at System.Data.OracleClient.OracleInternalConnection.ActivateForDistributedTransaction() at System.Data.OracleClient.OracleInternalConnection.Activate() at System.Data.OracleClient.DBObjectPool.GetObject(Object owningObject, Boolean& isInTransaction) at System.Data.OracleClient.OracleConnectionPoolManager.GetPooledConnection(String encryptedConnectionString, OracleConnectionString options, OracleConnection owningObject, Boolean& isInTransaction) at System.Data.OracleClient.OracleConnection.OpenInternal(OracleConnectionString parsedConnectionString, Object transact) at System.Data.OracleClient.OracleConnection.Open() at Microsoft.Practices.EnterpriseLibrary.Data.Database.OpenConnection() at Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteNonQuery(DBCommandWrapper command) at ReSource.MyLibService.ValidUser(String P_UserID, String P_UserPass) in e:\aspnet\resource\webservice\libservice.asmx.cs:line 55 at ReSource.MyLibService.VerifyCredential() in e:\aspnet\resource\webservice\libservice.asmx.cs:line 41
WEB SERVICE 的代码如下:
[WebMethod(TransactionOption=TransactionOption.Required)]
public string ValidUser(String P_UserID, String P_UserPass)
{
try
{
//这里有一些读取数据库的操作。
//这里是提交事务
}
catch(OracleException er)
{
//回滚事务
}
public string ValidUser(String P_UserID, String P_UserPass)
{
try
{
//这里有一些读取数据库的操作。
//这里是提交事务
}
catch(OracleException er)
{
//回滚事务
}
开始估计是 10g 的驱动什么的出了问题。上网搜索解决办法。发现有不少的类似的问题。但是没有什么很好的解决的方法。
网上这么说:
his is an Oracle change, not an MS issue. If you go to otn.oracle.com and
look up ODP.NET, you will find that the two Oracle versions of the ODP (pre
10g and 10g) are different, as well. MS has not updated its implementation
for 10g yet.
基于上面的说法,开始以为9i应该就没有问题了。于是把10g卸载,重新,安装9i 。
结果发现也是产生的同样的问题。但是无论在9i还是10g下面,和WEB SERVICE在同一个目录下面的asp.net页面都运行的非常好。于是就百思不得其解。给我郁闷坏了。当时怎么也找不到解决的办法。
网上也找到一些相关的内容。根据里面的设置,也没有起作用。
参见:配置Oracle,使它支持MTS下分布事务 、在MTS使用ODP读写Oracle是出现无法加载OraMTS的解决办法
根据里面的设置,也没有起作用。
就上oracle的网站上看看。没有metlink帐号,所以找东西找的也很辛苦。也基本上没有什么收获。后来,决定不找了,自己看看代码,找出问题到底出在哪儿。
鉴于在web service中的事务处理不好用,那就从web serivce上下手。我试着换掉了事务处理的代码。不进行事务处理,把 TransactionOption=TransactionOption.Required 这一句也去掉。运行,一切正常。看来是事务处理相关的Component 出现了错误。正好看到oracle网上有 ODP.net的 9207的版本,于是就看了看主要的内容,看到里面有一个 Oracle Services For Microsoft Transaction Server 9.2.0.7.0 而我的机器上的是9.2.0.1.0版本的,于是下载下来,升级。接着运行带有事务处理的web service,提示出现引用对象为空的异常,以前的没有找到dll文件的异常没有了。一阵狂喜,呵呵,离成功不远了。考虑安装过程中替换了一些dll可能需要重新启动才能生效。于是重新启动。试着运行。ok!正常运行。问题解决。心情轻松了不少!