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()其中对数据访问组件的判断如下:
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支持的数据访问组件:
Data Provider | Namespace |
---|---|
.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 |
不过这个帮助查到的太晚了,我们已经试出了结果,这也是经验教训,害的我们走了不少弯路!