把C#.NET程序移植到DB2上的經(jīng)驗(yàn)淺談
一直聽(tīng)說(shuō)DB2是個(gè)很牛叉的數(shù)據(jù)庫(kù),但是從知道有這么一個(gè)數(shù)據(jù)庫(kù)到真正有機(jī)會(huì)用還是經(jīng)過(guò)了漫長(zhǎng)的歲月,到了今年的7、8月份才有機(jī)會(huì)用這個(gè)數(shù)據(jù)庫(kù)。最近在北京做某銀行的現(xiàn)金管理系統(tǒng),銀行要求要用DB2數(shù)據(jù)庫(kù),沒(méi)辦法把所有的程序都在DB2上進(jìn)行了一次改進(jìn)優(yōu)化。
廢話(huà)不多說(shuō),直接分享經(jīng)驗(yàn)。
01:尋找DB2的安裝盤(pán)折騰了1-2周,因?yàn)椴惶瞄L(zhǎng)干這個(gè),DB2有好幾個(gè)版本,會(huì)分32位、64位的不同的安裝版本,開(kāi)發(fā)階段當(dāng)然是運(yùn)行在 Windows平臺(tái)下,只是真實(shí)部署時(shí)會(huì)在其他非Windows系統(tǒng)下而已,第一個(gè)安裝盤(pán)始終安裝失敗,后來(lái)同事又發(fā)了一個(gè)版本,一安裝就成功了,安裝過(guò)程非常簡(jiǎn)單,基本上只要設(shè)置用戶(hù)名、密碼就可以了,只要找到合適的安裝盤(pán)會(huì)非常順利了,安裝程序不是很大只有幾百兆1G都不到,安裝過(guò)程完畢運(yùn)行程序會(huì)出現(xiàn)一個(gè)錯(cuò)誤,在Windows里設(shè)置一下權(quán)限就可以正常使用了、Google一下就可以解決了。
02:DB2里如何執(zhí)行SQL語(yǔ)句摸索了2天才會(huì),因?yàn)闆](méi)人教,身邊也沒(méi)人會(huì)這個(gè),手頭也沒(méi)任何DB2的參考書(shū),就靠自己瞎摸索,終于知道了如何執(zhí)行SQL語(yǔ)句了,過(guò)了這個(gè)關(guān)后,基本上想干啥都會(huì)順利一些了,下面就是DB2的管理工具。
用戶(hù)可以與Windows的系統(tǒng)用戶(hù)集成在一起,用起來(lái)很方便,管理起來(lái)也靈活了。
04:DB2里2個(gè)字符相加,跟Oralce一樣,都需要用 “||” 符號(hào),參數(shù)化也用 @符號(hào),這些沒(méi)什么大區(qū)別,也跟Oralce類(lèi)似有 Dual 等特殊的表。
05:DB2里,又有子增量,又有序列,這方面比sqlsever好用多了,畢竟Oracle有序列,沒(méi)字增量,但是DB2很爽,字增量、序列的功能都有,主鍵可以靈活采用采用這2個(gè)方式之一,這樣效率也高一些,也會(huì)減少一些并發(fā)帶來(lái)的麻煩,省事一些。
06:DB2也有分頁(yè)的語(yǔ)句與Oralce類(lèi)似,查幾下資料就可了。
07:DB2里也可以建立分區(qū)等等,這個(gè)跟Oralce很相似、雖然DB2的管理工具也不是很漂亮,但是用起來(lái)還算舒服,比Oralce自帶的管理工具強(qiáng)很多,當(dāng)然說(shuō)管理工具最好用的還是sqlserver的,復(fù)制粘貼、批量復(fù)制粘貼等非常友善,這方面DB2、Oralce是差距甚遠(yuǎn)、他們沒(méi)考慮菜鳥(niǎo)級(jí)大眾用戶(hù),只考慮了專(zhuān)家。
08:那C#訪(fǎng)問(wèn)DB2用什么類(lèi)、這個(gè)DLL哪里下載?這個(gè)折騰了不少,到IBM網(wǎng)站上注冊(cè)了用戶(hù),才下載到這個(gè)DLL,雖然是VS2005版本的,但是也可以安裝,然后直接找到相應(yīng)的DLL,復(fù)制過(guò)來(lái),引用到自己的項(xiàng)目里就可以了。我采用了IBM.Data.DB2.dll。
09:接下來(lái)就是解決 數(shù)據(jù)庫(kù)連接串的問(wèn)題,沒(méi)幾下就測(cè)試成功了數(shù)據(jù)庫(kù)連接串,參考數(shù)據(jù)庫(kù)鏈接串如下:
- <add key="UserCenterDbConnection" value="Database=JIRI_UC;UserID=administrator;Password=pAssw0rd;Server=WIN-3T3M2TTDAFK;" />
- <add key="BusinessDbConnection" value="Database=JIRI_DB;UserID=administrator;Password=pAssw0rd;Server=WIN-3T3M2TTDAFK;" />
10:接下來(lái)就是導(dǎo)數(shù)據(jù)的工作了,以前花費(fèi)幾天寫(xiě)了一個(gè)將數(shù)據(jù)導(dǎo)入到Oralce的工具,這次稍微修改幾下花費(fèi)了半個(gè)小時(shí)就改進(jìn)為又支持導(dǎo)入Oralce、也支持導(dǎo)入DB2等任何數(shù)據(jù)庫(kù)的導(dǎo)入導(dǎo)出工具,代碼貼出來(lái)給大家分享一下,代碼總共沒(méi)幾行、但是非常實(shí)用。
- //--------------------------------------------------------------------
- // All Rights Reserved , Copyright (C) 2011 , Hairihan TECH, Ltd.
- //--------------------------------------------------------------------
- using System.Data;
- namespace DotNet.Example
- {
- using DotNet.BaseManager;
- using DotNet.DbUtilities;
- public class ImportExportData1
- {
- /// <summary>
- /// 導(dǎo)出數(shù)據(jù)庫(kù)到Oralce
- /// </summary>
- public void Export()
- {
- //this.ExportTable("ItemDetails");
- //this.ExportTable("Items_Condition");
- //this.ExportTable("Items_Currency");
- //this.ExportTable("Items_E_Signature");
- //this.ExportTable("Items_RoleCategory");
- //this.ExportTable("Items_SecurityLevel");
- //this.ExportTable("Items_TablePermissionScope");
- //this.ExportTable("Base_Comment");
- //this.ExportTable("Base_Exception");
- //this.ExportTable("Base_File");
- //this.ExportTable("Base_Folder");
- //this.ExportTable("Base_Items");
- //this.ExportTable("Base_Log");
- //this.ExportTable("Base_Message");
- //this.ExportTable("Base_Organize");
- this.ExportTable("Base_Module");
- //this.ExportTable("Base_PermissionItem");
- //this.ExportTable("Base_Role");
- //this.ExportTable("Base_Staff");
- //this.ExportTable("Base_Parameter");
- //this.ExportTable("Base_Permission");
- //this.ExportTable("Base_PermissionScope");
- //this.ExportTable("Base_Sequence");
- // this.ExportTable("Base_TableColumns");
- // this.ExportTable("Base_User");
- // this.ExportTable("Base_UserAddress");
- // this.ExportTable("Base_UserOrganize");
- // this.ExportTable("Base_UserRole");
- //this.ExportTable("Base_WorkFlowActivity");
- //this.ExportTable("Base_WorkFlowCurrent");
- //this.ExportTable("Base_WorkFlowHistory");
- //this.ExportTable("Base_WorkFlowProcess");
- System.Console.ReadLine();
- }
- public void ExportTable(string tableName)
- {
- ExportTable(tableName.ToUpper(), tableName.ToUpper());
- }
- /// <summary>
- /// 導(dǎo)出一個(gè)表
- /// </summary>
- /// <param name="tableName">表名</param>
- /// <param name="table">里面的數(shù)據(jù)</param>
- public void ExportTable(string tableName, string table)
- {
- // 這里是獲取目標(biāo)數(shù)據(jù)表的方法
- IDbHelper sourceDB = new SqlHelper("Data Source=192.168.0.121;Initial Catalog=UserCenterJMCB;User Id = sa ; Password = Password@1;");
- sourceDB.Open();
- DataTable dataTable = new DataTable(tableName);
- if (tableName.Equals(table))
- {
- dataTable = sourceDB.Fill("SELECT * FROM " + table);
- }
- else
- {
- dataTable = sourceDB.Fill(table);
- }
- sourceDB.Close();
- // 這里是目標(biāo)表的數(shù)據(jù)插入處理
- // IDbHelper targetDB = new OracleHelper("Data Source=KANGFU;user=usercenter;password=usercenter;");
- // IDbHelper targetDB = new DB2Helper("Database=JMCB_UC;UserID=JoinMoreCash;Password=P@ssw0rd;Server=WIN-3T3M2TTDAFK;");
- IDbHelper targetDB = new DB2Helper("Database=JMCB_UC;UserID=administrator;Password=p@ssw0rd2077;Server=WIN-3T3M2TTDAFK;");
- targetDB.Open();
- // targetDB.BeginTransaction();
- SQLBuilder sqlBuilder = new SQLBuilder(targetDB);
- try
- {
- // 清除表數(shù)據(jù)
- // targetDB.ExecuteNonQuery(" TRUNCATE TABLE " + tableName);
- targetDB.ExecuteNonQuery(" DELETE FROM " + tableName);
- // 創(chuàng)建配套的序列
- // targetDB.ExecuteNonQuery("create sequence SEQ_" + tableName.ToUpper() + " as bigint start with 1000000 increment by 1 minvalue 10000 maxvalue 99999999999999999 cycle cache 20 order");
- // targetDB.ExecuteNonQuery("create sequence SEQ_" + tableName + " minvalue 1 maxvalue 999999999999999999999999 start with 1 increment by 1 cache 20");
- int r = 0;
- for (r = 0; r < dataTable.Rows.Count; r++)
- {
- sqlBuilder.BeginInsert(tableName);
- for (int i = 0; i < dataTable.Columns.Count; i++)
- {
- sqlBuilder.SetValue(dataTable.Columns[i].ColumnName, dataTable.Rows[r][dataTable.Columns[i].ColumnName]);
- }
- sqlBuilder.EndInsert();
- System.Console.WriteLine("表 " + tableName + " 已插入第 " + r.ToString() + " 行");
- }
- System.Console.WriteLine(" - - 表 " + tableName + " 共插入 " + r.ToString() + " 行");
- targetDB.CommitTransaction();
- }
- catch (System.Exception exception)
- {
- // targetDB.RollbackTransaction();
- System.Console.WriteLine(tableName + " -- " + exception.Message);
- }
- finally
- {
- targetDB.Close();
- }
- }
- }
- }
11:為了相對(duì)系統(tǒng)的了解一下DB2數(shù)據(jù)庫(kù),狠下心30多元買(mǎi)了一本,翻了一天心里有感覺(jué)了,接著遇到什么問(wèn)題Google一下基本上就可以解決了。
前后折騰了半個(gè)多月,終于把C#.NET通用權(quán)限管理組件全部在DB2上調(diào)試了一遍,從從來(lái)沒(méi)摸過(guò)DB2到把數(shù)據(jù)庫(kù)都折騰好,很多事情說(shuō)起來(lái)簡(jiǎn)單,但是真正做好,做細(xì)節(jié)就會(huì)耗費(fèi)很多時(shí)間,2周多時(shí)間就這么一眨眼就過(guò)去了。其實(shí)這2周的成本大概是上萬(wàn)(杭州來(lái)回北京的路費(fèi) + 住酒店的費(fèi)用 + 工資成本 + 測(cè)試成本),還有好幾個(gè)人給測(cè)試確認(rèn)功能是否正確。
軟件是否值錢(qián)?想把一個(gè)軟件賣(mài)10000是很難的,很多人不能接受,但是等有需要時(shí)花費(fèi)20000也搞不定就可以充分體驗(yàn)到軟件貴如金,還好這些都由客戶(hù)買(mǎi)單否則自己還真沒(méi)實(shí)力亂折騰。這還不是開(kāi)發(fā)通用權(quán)限管理系統(tǒng)的成本,只是實(shí)現(xiàn)一個(gè)DB2數(shù)據(jù)庫(kù)上的兼容性就需要有這些成本才能實(shí)現(xiàn)好。
若真有又便宜質(zhì)量又好的軟件源碼,購(gòu)買(mǎi)遠(yuǎn)比自己開(kāi)發(fā)強(qiáng),自己寫(xiě)遠(yuǎn)沒(méi)有分析理解別人的代碼上改進(jìn)幾下見(jiàn)效快,何必跟自己過(guò)不去呢,浪費(fèi)那么多生命重復(fù)建設(shè)干啥,若我工作上遇到的難題,都可以別人能幫忙解決的話(huà)會(huì)全部購(gòu)買(mǎi)了完事了,該休息休息了。
C#連接DB2可以用IBM.Data.DB2.dll, 有需要這個(gè)類(lèi)庫(kù)的,加我QQ:252056973 索取。以上是膚淺的總結(jié)、有不足之處請(qǐng)指正、歡迎大家留言發(fā)表見(jiàn)解。
通用權(quán)限管理系統(tǒng)組件源碼現(xiàn)在支持 Access, mysql, sqlserver, Oracle, db2, SqLite 等等眾多。。。
將權(quán)限管理、工作流管理做到我能力的極致,一個(gè)人只能做好那么很少的幾件事情。
原文鏈接:http://www.cnblogs.com/jirigala/archive/2011/08/04/2126798.html
【編輯推薦】
- 令我難忘的DB2數(shù)據(jù)庫(kù)之路
- DB2復(fù)雜的應(yīng)用環(huán)境中的性能優(yōu)化
- DB2并發(fā)連接時(shí)的性能考慮
- DB2實(shí)用程序的性能優(yōu)化
- 一個(gè)筆記告訴你,從Java存儲(chǔ)轉(zhuǎn)到SQL存儲(chǔ)的過(guò)程