ADO.NET2.0还是比较常用的,于是我研究了一下ADO.NET2.0数据库,在这里拿出来和大家分享一下,希望对大家有用。下面开始我要说的利用ADO.NET2.0及以上版本新增的工厂式数据库访问实现应该系统的无缝切换,要实现无缝切换,当然还是要有前提条件了,就是各个不同的数据库之间的表和其它对象都已经成功移植了,没有这个前提,纯用ADO.NET2.0中数据库做系统无缝切换那是不可能的了,比如SQLSERVER中写的存储过程,自定义函数直接复制到ORACLE上就行了吗?当然是不行,写法及变量定义要做些调整才可以成功移植的,还有变结构字段类型等等的都可能是要做相应调整,这些都做好了才能谈系统的无缝切换。
#T#要做的无缝切换,数据库访问层的代码中最好(并非绝对)不应该出现SqlCommand,SqlDataAdapter,SqlClient,SqlXXX吧,要切换到ORACLE数据上ORACLE里可以OracleCommand,OracleXXX,还有程序执行带参数语句时,UserName,UserAge,如果在ORACLE里这么命名的话,系统开发过程中的那种痛苦也许只有经历过的人才知道,ORACLE坚持大写为标准,记得很久很久以前的一个夏天的晚上,那时我还是年轻的80后,一位数据库设计比较N的人提到过,尽量在数据库设计和T-SQL编程中采用大写标准,基本上接触的SQLSERVER数据库较多,也习惯了表名,字段名的大写设计,后来发现确实是有道理的。
这里提到的问题都是在下面的各个方法中为了兼容不同的数据库需要面对的问题,具体讲到每个执行方法时再具体解释。刚才说SqlCommand,OracleComand都是各自认得,但是DbCommand可是大家都认得的,暂且叫抽象对象吧,还有DbConnection,DbDataAdapter等都是他们都认得的,所以在做支持多数据库访问类库时,就可以用这些对象了,根据这些对象再创建具体对象。ADO.NET2.0数据库访问工厂中有个DbProviderFactory对象,也就是通常说的DataProvider了,正是这个起了关键和方便的作用,是用来创建提供程序对数据源类的实现的实例(就是用来创建实例)。另外数据库操作还要用到参数吧,DbParameter,DbParameterCollection下面都需要用到,先贴一段类库的构造函数,因为共用对象需要先实例化。
- publicDbConnectionconn;//抽象类型
- privateDbCommandcmd;//抽象类型
- privateDbProviderFactoryprovider;
- privateDbParameterPara;//不同数据库参数类型的抽象类型
- privateDbDataAdapterAdapter;//对应不同数据库的数据适配器
- Dictionary<Type,String>ParametersFormat;//不同数据库参数格式化类型
- publicstringretParaformat=string.Empty;//最终返回的格式化标志,如@{0},:{0}
- publicDataProviderFactory()
- {
- //从配置文件中取出标示数据库类型的字符串并通过ProviderName的不同支持不同类型的数据库
- stringproviderName=ConfigurationManager.ConnectionStrings["ConnStr"].ProviderName;//也可以用索引,从1开始
- //创建一个数据库对应的实例,使用该实例就可以创建对应的connection,command和adapater等等对象
- provider=DbProviderFactories.GetFactory(providerName);
- //创建具体的数据库连接类型和命令执行类型
- conn=provider.CreateConnection();
- conn.ConnectionString=ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;
- cmd=provider.CreateCommand();
- cmd.Connection=conn;
- //创建具体的参数类型
- Para=provider.CreateParameter();
- //创建具体的适配器类型
- Adapter=provider.CreateDataAdapter();
- //不同数据库参数前缀格式化
- ParametersFormat=newDictionary<Type,String>();
- ParametersFormat.Add(typeof(System.Data.SqlClient.SqlCommand),"@{0}");//因SQLSERVER只返回{0}没有@前缀,在此初始化处理
- //返回格式化标志
- retParaformat=GetParameterFormat(cmd);
- }