由于项目需要适用于Sybase 9.1.2和Sql Server 2000的数据库,刚开始使用DAAB3.1的Odbc来操作数据库,但总觉得不是十分灵活,而且Odbc连接Sql Server 2000效率也不高;再者,我也想项目能够提供对Oracle的支持。感谢天行者的daab3.1使用笔记,这篇文章介绍了如何通过只修改配置文件而不改动代码的情况下实现数据库的转换。
<configSections>
<section name="daabProviders" type="GotDotNet.ApplicationBlocks.Data.DAABSectionHandler, GotDotNet.ApplicationBlocks.Data">
</section>
</configSections>
<daabProviders>
<daabProvider alias="misapp" assembly="GotDotNet.ApplicationBlocks.Data" type="GotDotNet.ApplicationBlocks.Data.SqlServer" />
</daabProviders>
在代码中只要这样写 AdoHelper helper = AdoHelper.CreateHelper("misapp");
但是这里我有两个问题:
一、在天行者的文章里没有介绍我们怎么实例化一个IDbConnection,这在启用外部事务的时候是必须的。这点看起来比较好解决,我们可以写一个CreateConnection的工厂方法。
二、天行者的文章里也没有提到如何实例化IDataParameter,因为他是通过ADOHelper.GetSpParameterSet来得到IDataParameter的个数和类型。但如果ADOHelper.GetSpParameterSet不能使用怎么办?这种情况确实存在,比如说在Sybase 9.1.2下就行不通,具体请参见我的另一篇文章 使用DAAB 3.1连接Sybase ASE 11.9.2数据库的两个问题(原创)在这种情况下我们只能自己实例化IDataParameter。(修改于2006/07/07,由于使用OracleClient连接Oracle,其中同Odbc连接有很大的差异,比方说返回结果集只能用ref cursor,而且对于存储过程来说ExecuteScalar不能使用,因此,我们AdoHelper.ExecuteScalar方法不是通用的,因此下面的代码已经取消了对Oracle的支持)
下面是我自己写的实现上述两个问题的代码,代码未经过详细测试,本人不承担使用该代码的任何后果。
在web.config配置如下