新手必看篇之ADO.NET2.0數據庫
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);
- }