代码改变世界

DataWindow.Net 访问Oracle数据库

2009-12-11 10:12  keebing  阅读(855)  评论(0编辑  收藏  举报

  dw.net给我们提供了2个事务类,Transaction和AdoTransaction,Transaction事务只能用在datawindow或datastore上,不能共享数据访问接口,也就是说如果用Transaction类,在同一个事务中不能更再用command等对象对数据库操作;而AdoTransaction类则提供这种支持,但AdoTransaction对数据访问组件的支持比较少。

  在新项目中由于服务器的限制我们只能选用Oracle数据库,之前的应用后台数据都是SQLSERVER,我可以使用System.Data.SqlClient连接数据库,然后将链接绑定到AdoTransaction上,这样就可以使更新数据窗口和command等对象执行的操作在同一事务中。但System.Data.OracleClient的连接不被dw.net所支持,又看了一下AdoTransaction的BindConnection()方法,在注释中是这样说的:

Only System.Data.OleDb.OleDbConnection is currently supported by the sybase.DataWindow.AdoTransaction class.

  这句话也是误导我们的因素,我们试了微软和Oracle提供的OLEDB访问组件都不尽如人意,困难摆在眼前我们也得想办法解决呀,随后上sybase网站上找资料发现在dw2.0新特性中说到支持ase(sybase自己出的数据访问组件,是收费的),这个只能做最后选择了。后来查到oracle自己出了针对.net的数据访问组件ODP.NET,oracle自己出的东西效率和支持上肯定是最好的。

  在测试中ODP.NET完全支持dw.net的AdoTransaction类,这下心里可高兴了,但sybase代码中备注不是说只支持System.Data.OleDb.OleDbConnection吗?这又怎么解释?反编译datawindow.dll看看究竟,BinDConnection()其中对数据访问组件的判断如下:

 

Type type = this.m_adoDbConnection.GetType(); 
OleDbConnection adoDbConnection 
= this.m_adoDbConnection as OleDbConnection; 
SqlConnection connection2 
= this.m_adoDbConnection as SqlConnection; 
if (((adoDbConnection == null&& (connection2 == null)) && ((type.FullName != "Oracle.DataAccess.Client.OracleConnection"&& (type.FullName != "Sybase.Data.AseClient.AseConnection"))) { throw new InvalidOperationException("Connection type:" + type.FullName + "is not supported."); }

 

 

 

 

  太不可思竟议了,原来dw.net 是支持ODP.NET的,从这句话中就能看出来,代码和注释不一致,简直无语了!最后在dw.net帮助中搜索了ODP.NET,果然查询到了。下面是dw.net2.0支持的数据访问组件:

Table 4-1: Supported ADO.NET data providers
Data ProviderNamespace
.NET Framework Data Provider for OLE DB System.Data.OleDb
.NET Framework Data Provider for SQL Server System.Data.SqlClient
Oracle Data Provider for .NET (ODP.NET) Oracle.DataAccess.Client
Sybase ADO.NET Data Provider for Adaptive Server Enterprise (ASE) Sybase.Data.AseClient

  不过这个帮助查到的太晚了,我们已经试出了结果,这也是经验教训,害的我们走了不少弯路!